您好,登錄后才能下訂單哦!
如何進行IdentityHashMap集合的源碼解析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
我們將介紹一下IdentityHashMap集合的相關知識。看名字我們知道IdentityHashMap集合底層是通過HashMap集合實現的。那么按照我們分析其它集合一樣,它也一定是具有某種特殊的特性的,否則Java也不會提供一個單獨的IdentityHashMap集合了。我們先不介紹IdentityHashMap集合有哪種特性,我們先看下面的例子,然后在做詳細說明。
看輸出結果我們對HashMap集合的輸出結果不會感到意外,但是IdentityHashMap集合的結果卻很讓人費解。因為按照我們以前對集合的分析,不是說在HashMap中不允許有重復的key存在嗎,如果有相同的key則后添加到集合中的元素的value會覆蓋前一個元素中的value,這也是我們在分析HashMap那篇文章中總結出的HashMap的特性。那么為什么在IdentityHashMap集合中卻可以保存兩個相同的key呢?其實答案很簡單,這就是IdentityHashMap集合的特性所在。
我們在分析HashMap底層實現時知道,在HashMap集合中首先會判斷key的hashCode是否相等,然后在判斷key是否相等。如果這兩個判斷都相等則認為當前存儲的兩個元素的key是相等的,于是就執行value的覆蓋操作。并且上述判斷不但會判斷==還會用equals方法判斷。這也是為什么在將對象類型的數據保存在HashMap集合中必須重寫equals方法的根本原因。如果不這樣做HashMap集合就會認為這兩個元素的key不是相同的。這也就是IdentityHashMap集合與HashMap集合的底層實現不同的根本所在,就是因為在IdentityHashMap集合中只會用==判斷兩個key是否相等,而不會調用key的equals方法判斷。如果兩個key==相等則IdentityHashMap集合就會認為這兩個key相等,于是執行value的覆蓋操作。如果保存在IdentityHashMap集合中的key==不相等,則就會把這兩個key所對應的元素都保存在集合中,而不會執行value的覆蓋操作。
在上述代碼中我們創建了兩個String對象,并且我們知道在Java中如果不是基本數據類型采用==比較的話,它們實際比較的是內存地址。因為我們創建了兩個String對象,所以上述的比較結果一定為false。所在IdentityHashMap集合就會認為這兩個key是不同的key,于是將這兩個元素都保存在集合中。而在HashMap集合中除了進行上述比較外,還會調用key的equals方法進行比較。因為我們保存的key是一個String,并且在String這個類中已經重寫了equals方法,所以調用該方法實際比較的就是真正的值,也就是key和key做比較。正是因為它們相等,所以HashMap集合就會執行value的覆蓋操作。所以在輸出的結果中HashMap集合只會保存一個元素。下面我們看一下IdentityHashMap集合的底層源碼,來證明我們上述所說的。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。