新手初學Java-Map
Map
Map是一種依照鍵(key)存儲元素的容器,鍵(key)很像下標,在List中下標是整數。在Map中鍵(key)可以使任意類型的對象。Map中不能有重復的鍵(Key),每個鍵(key)都有一個對應的值(value)。
一個鍵(key)和它對應的值構成map集合中的一個元素。
Map中的元素是兩個對象,一個對象作為鍵,一個對象作為值。鍵不可以重復,但是值可以重復。
看頂層共性方法找子類特有對象.
Map與Collection在集合框架中屬並列存在
Map存儲的是鍵值對
Map存儲元素使用put方法,Collection使用add方法
Map集合沒有直接取出元素的方法,而是先轉成Set集合,在通過迭代獲取元素
Map集合中鍵要保證唯一性
也就是Collection是單列集合, Map 是雙列集合。
學習體系
Map學習體系: ---| Map 接口 將鍵映射到值的對象。一個映射不能包含重復的鍵;每個鍵最多隻能映射到一個值。 ---| HashMap 采用哈希表實現,所以無序 ---| TreeMap 可以對健進行排序 ---|Hashtable: 底層是哈希表數據結構,線程是同步的,不可以存入null鍵,null值。 效率較低,被HashMap 替代。 ---|HashMap: 底層是哈希表數據結構,線程是不同步的,可以存入null鍵,null值。 要保證鍵的唯一性,需要覆蓋hashCode方法,和equals方法。 ---| LinkedHashMap: 該子類基於哈希表又融入瞭鏈表。可以Map集合進行增刪提高效率。 ---|TreeMap: 底層是二叉樹數據結構。可以對map集合中的鍵進行排序。需要使用Comparable或者Comparator 進行比較排序。return 0,來判斷鍵的唯一性。
常見方法
1、添加: 1、V put(K key, V value) (可以相同的key值,但是添加的value值會覆 蓋前面的,返回值是前一個,如果沒有就返回null) 2、putAll(Map<? extends K,? extends V> m) 從指定映射中將所有映射關 系復制到此映射中(可選操作)。 2、刪除 1、remove() 刪除關聯對象,指定key對象 2、clear() 清空集合對象 3、獲取 1:value get(key); 可以用於判斷鍵是否存在的情況。當指定的鍵不存在的時候,返 回的是null。 3、判斷: 1、boolean isEmpty() 長度為0返回true否則false 2、boolean containsKey(Object key) 判斷集合中是否包含指定的key 3、boolean containsValue(Object value) 判斷集合中是否包含指定的value 4、長度: Int size()
Map的操作
這裡使用hashMap
map增刪查
import java.util.HashMap; import java.util.Map; public class Maps { public static void main(String[] args){ Map<String,String> myMap=new HashMap<String,String>(); myMap.put("N0lan","tryup"); myMap.put("Cors","study");//add System.out.println(myMap); myMap.remove("N0lan");//delete System.out.println(myMap.get("Cors"));//find System.out.println(myMap.isEmpty());//panduan System.out.println(myMap.containsKey("Hello"));// } }
map的遍歷
keySet遍歷
將Map轉成Set集合(keySet()),通過Set的迭代器取出Set集合中的每一個元素(Iterator)就是Map集合中的所有的鍵,再通過get方法獲取鍵對應的值。
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Maps { public static void main(String[] args){ /* Map<String,String> myMap=new HashMap<String,String>(); myMap.put("N0lan","tryup"); myMap.put("Cors","study");//add System.out.println(myMap); myMap.remove("N0lan");//delete System.out.println(myMap.get("Cors"));//find System.out.println(myMap.isEmpty());//panduan System.out.println(myMap.containsKey("Hello"));//*/ Bianli(); } public static void Bianli(){ Map<String,String> myMap=new HashMap<String,String>(); myMap.put("N0lan","tryup"); myMap.put("III","tryups"); myMap.put("Cors","study");//add // // 獲取方法: // 第一種方式: 使用keySet // 需要分別獲取key和value,沒有面向對象的思想 // Set<K> keySet() 返回所有的key對象的Set集合 Set<String> keyvaule= myMap.keySet(); Iterator<String> keys=keyvaule.iterator(); while(keys.hasNext()){ String key=keys.next(); String vaule=myMap.get(key); System.out.println("key=" + key + " vaule=" + vaule); } } }
第二種方式:通過values獲取所有值,不能獲取到key對象
第三種方式: Map.Entry遍歷
面向對象的思想將map集合中的鍵和值映射關系打包為一個對象,就是Map.Entry,將該對象存入Set集合,Map.Entry是一個對象,那麼該對象具備的getKey,getValue獲得鍵和值。
public static void Entryt(){ Map<String,String> myMap=new HashMap<String,String>(); myMap.put("N0lan","tryup"); myMap.put("III","tryups"); myMap.put("Cors","study");//add // 返回的Map.Entry對象的Set集合 Map.Entry包含瞭key和value對象 Set<Map.Entry<String,String>> ts= myMap.entrySet(); Iterator<Map.Entry<String,String>> all=ts.iterator(); while (all.hasNext()){ Map.Entry<String, String> allin = all.next(); System.out.println("key="+allin.getKey()+" value="+allin.getValue()); } } }
HashMap案例用自定義對象作為Map的key
import sun.invoke.empty.Empty; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class SelfClass { public static void main(String[] args){ HashMap<Person,String> mymap=new HashMap<Person,String>(); mymap.put(new Person("N0lan",99),"boy"); mymap.put(new Person("zAD",99),"GIR"); Set<Map.Entry<Person,String>> duixiang=mymap.entrySet(); Iterator<Map.Entry<Person, String>> it = duixiang.iterator(); while(it.hasNext()){ Map.Entry<Person,String> next=it.next(); Person key= next.getKey(); String value = next.getValue(); System.out.println(key + " = " + value); } } } class Person{ private String name; private int age; Person(){ } public Person(String name,int age){ this.name=name; this.age=age; } public String getName(){ return name; } public void Setname(String name){ this.name=name; } @Override public int hashCode() { return this.name.hashCode() + age * 37; } @Override public boolean equals(Object obj) { if (obj instanceof Person) { Person p = (Person) obj; return this.name.equals(p.name) && this.age == p.age; } else { return false; } } @Override public String toString() { return "Person@name:" + this.name + " age:" + this.age; } }
TreeMap
TreeMap的排序,TreeMap可以對集合中的鍵進行排序。如何實現鍵的排序?
方式一:元素自身具備比較性
和TreeSet一樣原理,需要讓存儲在鍵位置的對象實現Comparable接口,重寫compareTo方法,也就是讓元素自身具備比較性,這種方式叫做元素的自然排序也叫做默認排序。
方式二:容器具備比較性
當元素自身不具備比較性,或者自身具備的比較性不是所需要的。那麼此時可以讓容器自身具備。需要定義一個類實現接口Comparator,重寫compare方法,並將該接口的子類實例對象作為參數傳遞給TreeMap集合的構造方法。
註意:當Comparable比較方式和Comparator比較方式同時存在時,以Comparator的比較方式為主
總結
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- Java之map的常見用法講解與五種循環遍歷實例代碼理解
- Java集合類之Map集合的特點及使用詳解
- 帶你入門Java的集合
- Java那點兒事之Map集合不為人知的秘密有哪些
- Java Map集合詳解與演示