Java集合存在于 java.util包中
主要有3種:set(集)、list(清單包含Queue)和map(映射)。
以下是關于hashcode的一些規定:
兩個對象相等,hashcode一定相等
兩個對象不等,hashcode不一定不等
hashcode相等,兩個對象不一定相等
hashcode不等,兩個對象一定不等
問題1:HashSet底層實作原理?
答:HashSet先計算hashCode,如果有hashCode相同的值,則用equals比較值是否相同,值相同則不存儲。如果hashCode不同,則直接存儲。
問題2:為什麼不直接equals比較值是否相同,而先要計算hashCode?
答:hash算法是二進制算法,計算式本質是二進制,是以hash算法速度很快。如若hashCode不同則可直接存儲不用equlas比較。是以先計算hashCode大大加快了存儲速率。
問題3:ConcurrentHashMap和HashMap和HashTable的差別?
- Hashtable的任何操作都會把整個表鎖住,是阻塞的。好處是總能擷取最實時的更新,比如說線程A調用putAll寫入大量資料,期間線程B調用get,線程B就會被阻塞,直到線程A完成putAll,是以線程B肯定能擷取到線程A寫入的完整資料。壞處是所有調用都要排隊,效率較低。
- ConcurrentHashMap 是設計為非阻塞的。在更新時會局部鎖住某部分資料,但不會把整個表都鎖住。同步讀取操作則是完全非阻塞的。好處是在保證合理的同步前提下,效率很高。壞處 是嚴格來說讀取操作不能保證反映最近的更新。例如線程A調用putAll寫入大量資料,期間線程B調用get,則隻能get到目前為止已經順利插入的部分 資料。
- HashMap線程不安全。HashMap根據鍵的hashCode值存儲資料,大多數情況下可以直接定位到它的值,因而具有很快 的通路速度,但周遊順序卻是不确定的。 HashMap最多隻允許一條記錄的鍵為null,允許多條記 錄的值為 null。
選擇哪一個,是在性能與資料一緻性之間權衡。ConcurrentHashMap适用于追求性能的場景,大多數線程都隻做insert/delete操作,對讀取資料的一緻性要求較低。