成人免费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實例源碼分析

2021-09-10 06:50:03

HashMapHash方法

2016-09-12 14:33:20

javaHashMap

2023-02-13 08:01:49

HashHashMapint

2012-03-15 16:12:57

JavaHashMap

2012-03-15 17:18:33

JavaHashMap

2018-04-19 14:11:50

2012-02-15 10:34:29

JavaJava Socket

2021-11-08 15:06:15

鴻蒙HarmonyOS應用

2011-05-27 14:03:22

網站流量

2022-05-09 11:52:38

Java卡片服務卡片

2022-03-04 15:43:36

文件管理模塊Harmony鴻蒙

2021-10-11 11:58:41

Channel原理recvq

2021-12-01 07:02:16

虛擬化LinuxCPU

2021-10-28 19:27:08

C++指針內存

2021-12-17 07:47:37

TCASwiftUI 運作

2021-06-29 08:28:12

算法順序表數據

2021-01-18 05:33:08

機器學習前端算法

2021-02-15 15:36:20

Vue框架數組

2020-10-15 14:10:51

網絡攻擊溯源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 台湾a级理论片在线观看 | 亚洲69p| 欧美日韩三级在线观看 | 日韩欧美一区二区三区免费看 | 久久精品一区 | 日韩a视频 | 国内精品成人 | 国产成人99久久亚洲综合精品 | 久久久久久久av | 国产成人高清 | 在线视频亚洲 | 天天看天天爽 | 日本免费在线 | www.欧美 | 精品一区久久 | 亚洲欧洲精品一区 | 亚洲成人一级片 | 九九福利| 精品在线观看一区 | 欧美精品久久久久久久久久 | 欧美精品啪啪 | 国产二区视频 | 精品国产91亚洲一区二区三区www | 欧美日在线 | 欧美成人激情 | 久久精品欧美一区二区三区不卡 | 欧美视频成人 | 国产性网 | 四虎精品在线 | 欧美日韩高清免费 | 91在线视频在线观看 | 成人国产免费视频 | 午夜在线视频 | 一区二区在线 | 丝袜毛片 | 日韩一二区在线 | 91精品国产色综合久久不卡98 | 午夜一区二区三区在线观看 | 国产精品久久久久久二区 | 日韩欧美中文字幕在线观看 | 日本国产欧美 |