日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

hashcode的作用,方法的作用( 二 )


覆蓋 equals 方法的準則自反性:對于任何非空引用值 A,A.equals(A) 返回 true 。對稱性:對于任何非空引用值 A 和 B,A.equals(B) 和 B.equals(A) 的結果相同 。傳遞性:對于任何非空引用值 A、B 和 C,如果 A.equals(B) 返回 true,A.equals(C) 返回 true,那么 B.equals(C) 也是 true 。
一致性:對于任何非空引用值 A 和 B,每一次調用 x.equals(y) 的結果是相同的 。非空性:對于任何非空引用值 A,A.equals(null) 應返回 false 。equals() 與 hashCode()hashCode() 方法是獲取 hash 碼(哈希碼、散列碼),我們可以把它看做返回一個 int 整數(shù);hash 碼的作用是確定對象在散列結構中的位置 。
hashCode() 方法存在于 Object 類中,代表 Java 中的任何類都會有 hashCode() 方法,那么任何場景下 hashCode() 都會產生作用么?其實并不是!如果對象會被放入散列結構中使用,那么 hashCode() 就會起作用 。比如,當我們要向 HashMap 中放入一組 key-value 的時候,那么 HashMap 會先根據(jù) key 對象的 hashCode 值判斷存入的位置,如果 key 存入的位置上已經(jīng)有了一個元素,再根據(jù) equals() 方法判斷兩個元素是否相等;如果確認相等,那么會覆蓋原來的 key-value。
這時候,equals() 與 hashCode() 就是有關系的:兩個對象 equals() 返回 true 的時候,那它們的 hashCode() 值需要相等;如果兩個對象的 hashCode() 值相等,那它們 equals() 不一定是 true;(哈希沖突)所以在這種情況下,如果要判斷兩個對象是否相等,除了要覆蓋 equals() ,也要覆蓋 hashCode(),否則就會發(fā)生意料之外的問題 。
jdk8中的ConcurrentHashMap究竟為什么高效?

hashcode的作用,方法的作用


從源碼來窺其一斑!我們都知道hashMap不是線程安全的,因為在擴容方法中很容易出現(xiàn)死循環(huán),hashTable使用鎖的方式比較簡單暴力,幾乎在所有操作方法上都加了synchronized鎖,導致總體性能很差,concurrentHashmap憑借線程安全且性能優(yōu)異一直都是高并發(fā)中的首選key-value型數(shù)據(jù)結構; concurrentHashmap的高性能有以下原因:一,分段鎖:jdk8中對concurrentHashmap進行了改進,拋棄了jdk7中新建segment作為分段鎖的過程,jdk8中雖沿用了這種分段鎖的思想,卻直接使用數(shù)組中的數(shù)據(jù)作為分段鎖保證concurrentHashmap在上鎖的時候只針對數(shù)組下標下的數(shù)據(jù)進行上鎖(比如如果數(shù)組長度為256,那么每次put平均只有1/256的數(shù)據(jù)被鎖),而大多數(shù)其他的數(shù)據(jù)還是能進行正常的增刪改操作,無需阻塞等待,這無疑極大的降低了鎖的粒度,提升了性能 。
【hashcode的作用,方法的作用】二,紅黑樹 :jdk8中引入了紅黑樹結構,在單個數(shù)組下標內的數(shù)據(jù)達到8以后,會自動轉換為紅黑樹進行存儲,使用大O表示法表示效率的話,紅黑樹的查找效率為O(log(n)),而鏈表的效率為O(n),當數(shù)據(jù)量越來越大的時候,紅黑樹的效率明顯好于鏈表,所以concurrentHashmap性能得到很大提升;現(xiàn)在我們主要從put方法中的主要方法來分析性能的提升: spread(key.hashCode());//作用是再次哈希,減少沖突 ,源碼如下其中涉及到的位運算有

推薦閱讀