Map下的介面及其多個實作類
1.Map :雙列資料存盤key-value對的資料,---類似于高中弄的函式:y=f(x)
(1)HashMap:作為map的主要實作類,執行緒不安全的,效率高,存盤在null的key-value
①存盤在null的key和value如下圖所示

LinkedHashMap:保證在遍歷map元素時,可以按照添加的順序實作遍歷,是因為在原有的hashmap底層結構的基礎上,添加了一對指標直向前一個和后一個元素
(2)TreeMmap:保證按照添加的key-value 對進行排序,實作排序遍歷,此時考慮key的自然排序,或者定制排序,底層使用紅黑樹
(3)Hashtable :作為古老的實作了執行緒安全的,效率低,不能存盤null的key-value
①不能存盤null的dekey和value如下圖所示

2.map中存盤key - value的特點
(1)Map中的key是無序的,不可重復的,使用set存盤所有的key -->key所在的類要重寫equals和hashcode方法(以hashmap為例)
(2)Map中的value:無序的,可重復的,使用collection存盤所有的value,--->value所在的類要重寫equals()
一個鍵值對:key-value構成一個entry物件
Map中的entry:無序的,不可重復的,使用set存盤有的entry;
3.hashmap的底層實作原理:
以jdk7為例說明:
(1)HashMap map = new HashMap():在實體化以后,底層創建了一個長度為16的一維陣列.
map.put(key1,value1)??/首先,呼叫key1所在類的hashCode()計算key1的哈希值,次哈希值經過某種演算法計算以后,得到在entry陣列中的存放位置,
①如果此位置上的資料為空,此時的key1-value1添加成功,
②如果此位置上的資料不為空,(意味著此位置上存在一個或多個資料(以鏈表形式存在),比較key1和已經存在的一個或多個資料的哈希值:
如果key1的哈希值與已經存在的資料的哈希值都不相同,此時key1-value1添加成功
如果key1的哈希值和已經存在的某一個資料(key2-value2)的哈希值相同,繼續比較,呼叫key1所在類的equals(key2)方法,比較:
如果equals()回傳false:此時key1-value1添加成功
如果equals()回傳true:使用value1替換value2
jdk8相較于jdk7在底層實作方面的不同:
(1)new HashMap():底層沒有創建一個長度為16的陣列
(2)jdk 8 底層的陣列是:Node[],而非entry[]
(3)首次呼叫put()方法時,底層創建了長度為16的陣列
(4)jdk7底層結構只有:陣列+鏈表,jdk8中底層結構,陣列+鏈表+紅黑樹
當陣列的某一個索引位置上的元素以鏈表形式存在的資料個數 > 8 且當前陣列的長度 > 64時,此時此索引位置上的所有資料改為使用紅黑樹存盤,可以使得查找效率增加,
4.Map介面:常用方法

(1)添加、洗掉、修改方法
點擊查看代碼
@Test
public void test(){
Map map = new HashMap();
// map = new Hashtable();
//Object put(Object key, Object value):將指定key-value添加到(或修改)當前map物件中
map.put("Twq",23);
map.put("AA",46);//這里添加AA及其對應的value值
map.put("CC",34);
map.put("BB",12);
map.put(45,12);
map.put("AA",12);//當AA關鍵值已經存在的時候,就修改其對應的value值
System.out.println(map);
System.out.println("==================");
//void putAll(Map m):將m中所有key-value對存放到當前map中
Map map1 = new HashMap();
map1.put("CC",12);
map1.put("DD",1212);
map.putAll(map1);//若map1中存在與map中key值相同的值,則將會修改原來map中的key的值
System.out.println(map);
System.out.println("==================");
//Object remove(Object key)移除指定key的key--value對,并回傳value,若key值不存在,則回傳null
Object value = https://www.cnblogs.com/twq46/p/map.remove("CC");
System.out.println(value);
System.out.println(map);
System.out.println("==================");
//void clear()清空當前map中的所有資料
map.clear();//與map = null操作不同,map集合還在,只是里面沒有資料
System.out.println(map.size());
System.out.println(map);
}

(2)元素查詢操作
點擊查看代碼
@Test
public void test1(){
Map map = new HashMap();
map.put("Twq",23);
map.put("AA",46);
map.put(12,34);
//Object get(Object key):獲取指定key對應的value,若沒有的話就就會回傳null
System.out.println(map.get(12));
System.out.println("================");
//boolean containskey(object key):是否包含指定的key
System.out.println(map.containsKey("Twq"));
System.out.println(map.containsValue(42));
System.out.println("================");
//boolean equals(Object obj):判斷當前map和引數物件obj是否相同
Map map1 = new HashMap();
map1.put("Twq",23);
map1.put("AA",46);
map1.put(12,34);
System.out.println(map.equals(map1));
}

(3)元視圖的操作方法
點擊查看代碼
@Test
public void test2(){
//Set keySet():回傳所有key構成的Set集合
//遍歷所有的key集:keyset()
Map map = new HashMap();
map.put("Twq",23);
map.put("AA",46);
map.put(12,34);
Set set = map.keySet();
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("===============");
//遍歷所有的value:values()
Collection coll= map.values();
for(Object obj : coll){
System.out.println(obj);
}
System.out.println("=================");
//遍歷所有的key-value:
Set set1 = map.entrySet();
//方式一:entrySet()
Iterator iterator1 = set1.iterator();
while(iterator1.hasNext()){
Object obj = iterator1.next();
//entrySet集合中的元素都是entry
Map.Entry entry = (Map.Entry)obj;
System.out.println(entry.getKey()+"--->"+entry.getValue());
}
System.out.println();
//方式二:
Set set2 = map.keySet();
Iterator iterator2 = set2.iterator();
while(iterator2.hasNext()){
Object key = iterator2.next();
Object value = https://www.cnblogs.com/twq46/p/map.get(key);
System.out.println(key +"===" + value);
}
}

5.TreeMap
(1)向TreeMap中添加key -- value ,要求key必須是由一個類創建的物件
(2)因為要按照key進行排序:自然排序,定制排序
①自然排序:
點擊查看代碼
@Test
public void test3(){
Person p1 = new Person("Tom", 23);
Person p2 = new Person("Jerry", 32);
Person p3 = new Person("Mike", 20);
Person p4 = new Person("Rose", 18);
TreeMap map = new TreeMap();
map.put(p1,98);
map.put(p2,113);
map.put(p3,28);
map.put(p4,43);
Set set = map.entrySet();
Iterator iterator = set.iterator();
while(iterator.hasNext()){
Object obj = iterator.next();
Map.Entry entry = (Map.Entry)obj;
System.out.println(entry.getKey() + "--->"+entry.getValue());
}
}

②定制排序
點擊查看代碼
@Test
public void test4(){
Person p1 = new Person("Tom", 23);
Person p2 = new Person("Jerry", 32);
Person p3 = new Person("Mike", 20);
Person p4 = new Person("Rose", 18);
TreeMap map = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Person && o2 instanceof Person){
Person p1 = (Person) o1;
Person p2 = (Person) o2;
return Integer.compare(p1.getAge(),p2.getAge());
}
throw new RuntimeException();
}
});
map.put(p1,98);
map.put(p2,113);
map.put(p3,28);
map.put(p4,43);
Set set = map.entrySet();
Iterator iterator = set.iterator();
while(iterator.hasNext()){
Object obj = iterator.next();
Map.Entry entry = (Map.Entry)obj;
System.out.println(entry.getKey() + "--->"+entry.getValue());
}
}

5.Map實作類Properties
主要用來處理屬性檔案,key和value都是String型別
(1)新建properties方法:注意要在專案名下新建,不能在包名下新建



(2)使用方法

點擊查看代碼
@Test
public void test5() throws Exception {
Properties pro = new Properties();
FileInputStream fis = new FileInputStream("jdbc.properties");
pro.load(fis);//加載流對應的檔案
String name = pro.getProperty("name");
String password = pro.getProperty("password");
System.out.println("name = " + name+",password = " + password);
}

(3)注意事項

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/498683.html
標籤:Java
