HashMap:線程不安全佑稠。底層jdk1.7之前是初始是16的entry數組缚柳,二叉樹鏈表(解決hash沖突)。jdk1.8之后是node苍姜,紅黑樹(當節(jié)點數大于8時)https://my.oschina.net/hosee/blog/618953
key值對象
@Override
public boolean equals(Object obj) {
return this.id == ((MyClass) obj).id;
}
/**重寫hashcode可以
@Override
public int hashCode() {
return id;
}
***/
紅黑樹:http://www.reibang.com/p/23b84ba9a498
為什么初始是16译蒂?
很多位運算保證了初始容量一定為2的冪
HashMap中的數據結構是數組+單鏈表的組合曼月,希望是元素存放的更均勻,最理想的效果是柔昼,Entry數組中每個位置都只有一個元素哑芹,這樣,查詢的時候效率最高捕透,不需要遍歷單鏈表聪姿,也不需要通過equals去比較K,而且空間利用率最大
HashTable:線程安全(synchronization)乙嘀。
LinkedHashMap:類似于HashMap末购,但是迭代遍歷它時,取得“鍵值對”的順序是其插入次序虎谢,或者是最近最少使用(LRU)的次序盟榴。只比HashMap慢一點;而在迭代訪問時反而更快婴噩,因為它使用鏈表維護內部次序擎场。
TreeMap:基于紅黑樹的實現。查看“鍵”或“鍵值樹”時讳推,它們會被排序(次序由Comparable或Comparator決定)顶籽。TreeMap的特點在于玩般,所得到的結果是經過排序的银觅。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹坏为。
ConcurrentHashMap (架構圖上和hashmap并列 繼承AbstractMap):1.7:鎖分段技術究驴,由多個Segment組成(Segment下包含很多Node镊绪,也就是鍵值對),每個Segment都有把鎖來實現線程安全洒忧,當一個線程占用鎖訪問其中一個段數據的時候蝴韭,其他段的數據也能被其他線程訪問。1.8的實現已經拋棄了Segment分段鎖機制熙侍,利用CAS+Synchronized來保證并發(fā)更新的安全榄鉴,底層依然采用數組+鏈表+紅黑樹的存儲結構。內存占用率和hashmap差不多蛉抓,get方法不會加鎖庆尘,所以速度不會慢,put方法支持并發(fā)巷送,有加鎖操作驶忌,速度多少會比hashmap慢一點⌒︴耍可以并發(fā)更新http://blog.csdn.net/u010412719/article/details/52145145? ? ? ? ? ? http://www.reibang.com/p/c0642afe03e0
arraylist:底層為數組付魔,查詢快,有順序飞蹂,可重復collections.synchronizedxxx是全部加了同步
linkedList:雙向鏈表几苍,修改快。
vector:同步synchronized
hashset:不可重復陈哑,無順序擦剑。
treetSet:Integer能排序(有默認順序), String能排序(有默認順序), 自定義的類存儲的時候出現異常(沒有順序),如果想把自定義類的對象存入TreeSet進行排序, 那么必須實現Comparable接口芥颈,不同步