成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java HashMap分析之二:Hash code

開發 后端
散列計算就是計算元素應該放在數組的哪個元素里。準確的說是放到哪個鏈表里面。按照Java的規則,如果你要想將一個對象放入HashMap中,你的對象的類必須提供hashcode方法,返回一個整數值。

散列計算就是計算元素應該放在數組的哪個元素里。準確的說是放到哪個鏈表里面。按照Java的規則,如果你要想將一個對象放入HashMap中,你的對象的類必須提供hashcode方法,返回一個整數值。比如String類就有如下方法:

  1. public int hashCode() {  
  2.         int h = hash;  
  3.         int len = count;  
  4.         if (h == 0 && len > 0) {  
  5.             int off = offset;  
  6.             char val[] = value;  
  7.  
  8.             for (int i = 0; i < len; i++) {  
  9.                 h = 31*h + val[off++];  
  10.             }  
  11.             hash = h;  
  12.         }  
  13.         return h;  
  14.     } 

注意上面的for循環,有點搞吧?我來舉個例子,讓你很容易明白它在搞什么名堂。比如有一個字符串“abcde”,采用31進制的計算方法來計算這個字符串的總和,你會寫出下面的計算式子:
a*31^4+b*31^3+c*31^2+d*31^1+e*31^0.注意,這里的a,b,c,d或者e指的是它們的ASCII值。很有趣的循環,居然可以用來算N進制。這個循環可以抽出來單獨作為計算進制的好工具:

  1. public static void main(String[] args) {  
  2.         int[] a={1,0};  
  3.         System.out.println(calculate(2,a));  
  4.     }  
  5.  
  6.     private static int calculate(int radix,int[] a){  
  7.         int sum = 0;  
  8.         for(int i=0;i<a.length;++i){  
  9.             sum = sum*radix+a[i];  
  10.         }  
  11.         return sum;  
  12.     } 

靜態方法caculate接受radix作為進制基數,數組a模擬要計算的進制的數字,只是注意表面順序需要一致。比如 01 二進制串,在數組中要按照{0,1}排列。上面的輸出結果是1,符合01的真實值。

那么為什么選用31作為基數呢?先要明白為什么需要HashCode.每個對象根據值計算HashCode,這個code大小雖然不奢求必須唯一(因為這樣通常計算會非常慢),但是要盡可能的不要重復,因此基數要盡量的大。另外,31*N可以被編譯器優化為

左移5位后減1,有較高的性能。其實選用31還是有爭議,反對者(參考http://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier
認為這個東西還是會導致較多的重復,應該用更大的數字。所以,或許將來Java的實現中會有所變化。下面這篇文章介紹了兩個結論:

1.基數要用質數

質數的特性(只有1和自己是因子)能夠使得它和其他數相乘后得到的結果比其他方式更容易產成唯一性,也就是hash code值的沖突概率最小。

2.選擇31是觀測分布結果后的一個選擇,不清楚原因,但的確有利。

http://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/

另外,String.hashCode內部會緩存第一次計算的值,因為這是一個final(不可變)類,也就是String對象的內容是不會變的。這能夠在多次put到HashMap的場合提高性能,不過似乎用處不多。

好了,終于扯完了String.hashCode的話題。現在繼續回到HashMap的數組元素位置計算上來。

 

原文鏈接:http://blog.csdn.net/sheismylife/article/details/7351005

【編輯推薦】

  1. Java HashMap分析之一:基本結構
  2. Java集合框架總結:Set接口的使用
  3. Java的位移運算巧方法
  4. Java7的一個新類JLayer:裝飾的Swing組件
  5. 關于Java中內存溢出的解決辦法
責任編輯:林師授 來源: sheismylife的博客
相關推薦

2015-08-10 15:12:27

Java實例源碼分析

2016-09-12 14:33:20

javaHashMap

2023-02-13 08:01:49

HashHashMapint

2021-09-10 06:50:03

HashMapHash方法

2012-03-15 17:18:33

JavaHashMap

2012-03-15 16:12:57

JavaHashMap

2018-04-19 14:11:50

2021-11-08 15:06:15

鴻蒙HarmonyOS應用

2012-02-15 10:34:29

JavaJava Socket

2021-12-01 07:02:16

虛擬化LinuxCPU

2021-10-11 11:58:41

Channel原理recvq

2011-05-27 14:03:22

網站流量

2022-05-09 11:52:38

Java卡片服務卡片

2022-03-04 15:43:36

文件管理模塊Harmony鴻蒙

2022-04-14 11:35:01

HarmonyOS手表Demo操作系統

2011-11-28 12:55:37

JavaJVM

2023-06-10 23:09:40

Redis場景內存

2021-10-28 19:27:08

C++指針內存

2021-12-17 07:47:37

TCASwiftUI 運作

2021-06-29 08:28:12

算法順序表數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区三区四区五区加勒比 | 天天视频一区二区三区 | 日本精品视频在线观看 | 日韩欧美一级精品久久 | av黄色在线 | 欧美一级三级在线观看 | 三a毛片| 91久久久久久 | 午夜视频免费在线观看 | 日韩在线欧美 | 91精品国产欧美一区二区 | 亚洲电影一区二区三区 | 涩涩视频网站在线观看 | 亚洲精品久久久久久下一站 | 欧美视频精品 | 亚洲欧美日韩一区二区 | 免费观看国产视频在线 | 玖玖视频国产 | 国产精品国产亚洲精品看不卡15 | 亚洲精品久久久久久久久久久久久 | 日批免费看 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 岛国毛片在线观看 | 国产97人人超碰caoprom | 日韩欧美成人一区二区三区 | 浮生影院免费观看中文版 | 国产精品网址 | 九九九久久国产免费 | 国产精品久久亚洲 | 国产精品日韩在线 | 91在线中文字幕 | 国内精品久久久久久 | 91久久久精品国产一区二区蜜臀 | 午夜精品在线观看 | 国产电影一区二区在线观看 | 日韩电影一区 | 亚洲一区二区精品视频 | 欧美激情在线精品一区二区三区 | 一区二区在线免费观看视频 | 中文字幕在线视频精品 | 成人福利在线观看 |