java中hashcode,hashmap,treemap等的一點思考(一)

1,hashcode的產生,堆裏面的基本數據類型,只要內容一樣就是一樣的,但是堆裏面的引用數據類型,對象等,要加上內存的地址,object是返回對象所在內存的地址,所以是不一樣的。因爲存在引用,即使兩個hashcode相同,也不一定是同一個對象
注:(一)如果兩個對象相同,那麼他們的hashcode也相同,但是如果hashcode相同,不能說明兩個對象相同,如下圖。
這裏寫圖片描述
(二)雖然不能用hashcode比較對象相同,但是可以用hashcode比較對象不同,如果hashcode不同,那麼兩對象一定不同,然後調用equals來比較,由於string等類型都會重寫了string方法,所以equals包含了類型而不僅僅是內容,==是比較內容的。
(hash這種通常來說時間複雜度是常量級的,只有知道一個對象的地址,就可以去取得這個對象(key->adress),而不用equals進行比較,對於hashset等來說,插入數據的時候,會有個table來存取hash值,從那裏進行對比)

2,map接口有兩個實現,第一是hashmap,另外treemap可以理解爲一個樹結構,從root開始,所以是有序的,hashmap是無序的,允許null值(除了同步和使用null值之外,hashtable和hashmap幾乎相同)。hashmap是比較鍵的hash,set是比較值得hash,map和set不同如下:
這裏寫圖片描述

3,對於hashmap來說,因爲沒有實現synchronous鎖,所以當併發的時候會出現問題,不能保持正常運行,而hashtable有一個synchronous,雖然保證了線程安全,但是一把鎖會導致效率很低。

4,,linklist底層是鏈表,因爲有鏈表的特性,即查找慢但是添加和刪除很快。arraylist,底層是數組,有着數組的特性,由於數組都是按下標查找的,所以查找很快,但是插入的時候需要移動插入元素的後面的元素。對於大量數據而言,不適合使用hashmap,因爲會引起地址衝入。

5,原始的arraylist佔用內存是24byte,而hashmap如果沒有指定大小,默認是16bit,如果超過了這個長度,就會擴容爲原來的兩倍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章