HashMap的jdk版本不同

2021-10-06 06:39:50 字數 1638 閱讀 4118

關於hashmap,其實在jdk1.8和1.7版本之間的差別還是蠻大的,這幾天在經過認真分析和理解之後,通過實驗將學習成果進行展示。

首先提出乙個問題:jdk1.7多執行緒環境下hashmap容易出現死迴圈?

public class hashmaptest 

} class hashmapthread extends thread

}}

請自行執行這段**,模擬迴圈死鎖現象。其實原理就是同時啟動多個執行緒,不斷進行put操作。

void transfer(entry newtable, boolean rehash) 

int i = indexfor(e.hash, newcapacity);

e.next = newtable[i];

newtable[i] = e;

e = next;}}

}

final v putval(int hash, k key, v value, boolean onlyifabsent,

2 boolean evict)

23 if (e.hash == hash &&

24 ((k = e.key) == key || (key != null && key.equals(k))))

25 break;

26 p = e;

27 }

28 }

30 v oldvalue = e.value;

31 if (!onlyifabsent || oldvalue == null)

32 e.value = value;

33 afternodeaccess(e);

34 return oldvalue;

35 }

36 }

37 ++modcount;

38 if (++size > threshold)

39 resize();

40 afternodeinsertion(evict);

41 return null;

42 }

這是jdk1.8中hashmap中put操作的主函式, 注意第6行**,如果沒有hash碰撞則會直接插入元素。如果執行緒a和執行緒b同時進行put操作,剛好這兩條不同的資料hash值一樣,並且該位置資料為null,所以這執行緒a、b都會進入第6行**中。假設一種情況,執行緒a進入後還未進行資料插入時掛起,而執行緒b正常執行,從而正常插入資料,然後執行緒a獲取cpu時間片,此時執行緒a不用再進行hash判斷了,問題出現:執行緒a會把執行緒b插入的資料給覆蓋,發生執行緒不安全。

另外區別:再新版本中煉表長度達到一定長度時,會自動轉化為紅黑樹。

不同jquery外掛程式 版本不同造成的問題

最近在開發中遇到乙個問題 我在同乙個頁面已用了兩個jquery外掛程式,但是這兩個外掛程式使用的jquery版本不同,所以總是不能同時生效。第乙個想法是找乙個都可以用的版本,但是我從1.幾版本到3.幾都試了,返現並不好使 說好的向下相容性呢 於是我想到了或許使用iframe可以實現。iframe i...

解決MySQL安裝的版本不同

解決mysql 安裝的 版本不同 1 登入mysql mysql u root 使用者名稱 p2 輸入密碼 root root 自己設定的密碼3 show databases 顯示資訊 show databases4 select user,plugin from mysql.user 進入mysq...

JDK7和JDK8中HashMap版本有什麼不同?

hashmap底層是陣列,稱為雜湊桶,儲存結構 jdk7是陣列 鍊錶,jdk8 是陣列 鍊錶 紅黑樹。1 鍊錶插入方式的不同 在1.7之前,鍊錶元素的插入採用的是頭插法,也就是說,當有新結點進來時,會在插入在鍊錶的頭部。很明顯,由於不用遍歷鍊錶,這種插入方式的效率是更高的。但是1.8之後,因為當結點...