- vector是線程安全的,但是因爲方法加了synchronized,必須串行執行,不適用於高併發且對性能要求較高的場景,所以目前很少用。
- map的key不可重複(通過set組織起來,所以有去重功能),value可以重複(通過collection組織起來)。
HashMap
- 結構:數組+鏈表+紅黑樹
- put方法
- 提升性能方法:轉紅黑樹、哈希運算
- 擴容問題:1)多線程環境下,調整大小存在條件競爭,容易造成死鎖 (非線程安全)
2)rehashing是一個比較耗時的過程 - 加載因子爲0.75
1)若加載因子過大,擴容門檻提高,擴容頻率降低,Hash衝突增多,需要用鏈表或紅黑樹存儲元素,運行效率會降低
2)若加載因子過小,擴容門檻降低,佔用空間增加,元素存儲稀疏,操作性能提高。
3)容量需要是2的冪 - 線程不安全改善
1)
Map hashMap = new HashMap();
Map safeHashMap = Collections.synchronizedMap(hashMap);
缺點:多線程環境下串行執行,效率低
2)使用ConcurrentHashMap
ConcurrentHashMap
- 結構:數組+鏈表+紅黑樹
- CAS+synchronized使鎖更加細化,保證併發安全
- 只鎖定當前鏈表/紅黑樹首結點
- put
- HashMap、HashTable、ConcurrentHashMap區別
異常
- Error和Exception
1)聯繫:均繼承自Throwable
2)區別:Error是程序無法處理的異常(JVM負責),,Exception是可以處理 - 運行時異常(程序負責), 非運行時異常(java編譯器負責)
- 異常處理順序
1)子類異常不能放在父類後面,因爲異常已經被父類處理
2)異常只會被一個catch塊處理,且按順序匹配
- 異常處理消耗性能
1)try catch塊影響jvm優化
2)異常對象實例需要保存棧快照等信息,開銷大