相信不少同窗都瞭解集合框架Map。但很多同窗對Map的瞭解僅僅限於HashMap,那不妨看看個人這篇文章,或許你會有所收穫!java
答:HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap數組
答: HashMap:底層是基於數組+鏈表實現,屬於非線程安全,默認容量是16,容許有空的健和值。安全
Hashtable:底層是基於哈希表實現,屬於線程安全(加了synchronized),默認容量是11,不容許有null的健和值。多線程
答: hashcode():頂級類Object裏面的方法,全部的類都是繼承Object,返回是一個int類型的數。根據必定的hash規則(存儲地址,字段,長度等),映射成一個數組,即散列值。併發
equals() :頂級類Object裏面的方法,全部的類都是繼承Object,返回是一個boolean類型。根據自定義的匹配規則,用於匹配兩個對象是否同樣,通常邏輯以下:1.判斷地址是否同樣、2.非空判斷和Class類型判斷、3.強轉、4.對象裏面的字段一一匹配。 代碼實戰以下:框架
import java.util.Date;
import java.util.Objects;
public class User {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hash(age,name);
}
@Override
public boolean equals(Object obj) {
if(this == obj) return true;
if(obj == null || getClass() != obj.getClass()) return false;
User user = (User) obj;
return age == user.age && Objects.equals(name, user.name) ;
}
}
複製代碼
答: hashMap: 使用散列桶實現(即數組+鏈表結構),能夠實現快速的存儲和檢索,可是包含無序的元素,適用於在map中插入、刪除和定位元素。 treeMap:使用存儲結構是一個平衡二叉樹,具體實現是紅黑樹,能夠自定義排序規則,要實現Comparator接口,能便捷的實現內部元素的各類排序,可是通常性能比HashMap差,適用於自定義排序規則。ide
答:set的核心就是集合中元素不可重複,存儲一組惟一的對象。 set中的每一種實現都是對應Map裏面的一種封裝,HashSet對應的就是HashMap,TreeSet對應的就是TreeMap。高併發
答:按照添加順序排序使用LinkedHashMap,按照天然排序與自定義排序用TreeMap。源碼分析
答:多線程環境下能夠用concurrent包下的ConcurrentHashMap或者使用Collections.synchronizedMap。ConcurrentHashMap雖然是線程安全,可是他的效率比Hashtable要高不少.性能
答:使用Collections.synchronizedMap包裝後返回的map是加鎖的。
答:HashMap底層是數組+鏈表+紅黑樹實現(jdk8纔有紅黑樹)。數組中的每一項都是一個鏈表,即數組與鏈表的結合體。在JDK1.8中,鏈表的長度大於8,鏈表會轉換成紅黑樹。
Entry元素是一個key-value的鍵值對,它持有一個指向下個Entry的引用,每一個Entry元素同時也做爲當前Entry鏈表的首節點,也指向了該鏈表的下個Entry元素。
答:Hash碰撞是指不一樣key計算獲得的Hash值相同,須要放到同個bucket中。
答:由於數據量少的時候操做數據,遍歷線性表比紅黑樹所消耗的資源少,因此前期採用線性表,等到必定數以後變換到紅黑樹。
答:ConcurrentHashMap是線程安全的Map, Hashtable類基本上全部的方法都是採用synchronized進行線程安全控制,高併發狀況下效率就會降。而ConcurrentHashMap是採用了分段鎖的思想提升性能,鎖粒度更細化。
歡迎你們糾正與補充!