天天看點

String 源碼探究

起因:忽然想到平時用的HashMap 當key是字元串的時候為什麼總可以覆寫,然後看了String的源碼發現:

hashCode方法:

equals方法:

很顯然hashCode和eques方法都是根據char[]數組中的char判斷的,但是hashCode函數裡面為什麼是

下面是知乎上的回答:

The value 31 was chosen because it is an odd prime. If it were even and the multiplication overflowed, information would be lost, as multiplication by 2 is equivalent to shifting. The advantage of using a prime is less clear, but it is traditional. A nice property of 31 is that the multiplication can be replaced by a shift and a subtraction for better performance: 31 * i == (i << 5) - i. Modern VMs do this sort of optimization automatically.

可是為什麼java可以s="abcd"這樣直接指派吶?難道和c語言裡面的重載一樣嗎?

但是否定的:

因為 從語言一級來看,java不支援運算符重載,這點是肯定的。

String類的”=”,”+”,”+=”,看似運算符重載,實際不是,隻是在java編譯器裡做了一點手腳。 

java編譯器對String的運算符做了特殊處理。

例如:

String s = “a”; 

s += “b”; 

編譯器轉換成了: 

s = (new StringBuilder()).append(s).append(“b”).toString();

HashSet: 繼承的AbstractSet内

Integer:

Double:

>>:帶符号右移。正數右移高位補0,負數右移高位補1

>>>:無符号右移。無論是正數還是負數,高位通通補0。

下面是關于hashCode的一些解釋:

Hash是散列的意思,就是把任意長度的輸入,通過雜湊演算法變換成固定長度的輸出,該輸出就是散列值。關于散列值,有以下幾個關鍵結論:

1、如果散清單中存在和散列原始輸入K相等的記錄,那麼K必定在f(K)的存儲位置上

2、不同關鍵字經過雜湊演算法變換後可能得到同一個散列位址,這種現象稱為碰撞

3、如果兩個Hash值不同(前提是同一Hash算法),那麼這兩個Hash值對應的原始輸入必定不同 

HashCode

然後講下什麼是HashCode,總結幾個關鍵點:

1、HashCode的存在主要是為了查找的快捷性,HashCode是用來在散列存儲結構中确定對象的存儲位址的

2、如果兩個對象equals相等,那麼這兩個對象的HashCode一定也相同

3、如果對象的equals方法被重寫,那麼對象的HashCode方法也盡量重寫

4、如果兩個對象的HashCode相同,不代表兩個對象就相同,隻能說明這兩個對象在散列存儲結構中,存放于同一個位置