java--集合-Map
一、什麼是Map
- 映射關係,也有人稱爲字典,Map集合裏存在兩組值,一組是key,一組是value。Map裏的key不允許重複。通過key總能找到唯一的value與之對應。
- Map裏的key集存儲方式和對應的Set集合中的元素存儲方式一致;
- 學生都有一個學號,我們能點學號就能找到某個學生,好比這個學號就是key,學生就是value。
- Map.Entry是Map接口的內部接口,專門用來保存key-value內容:
二、Map常用方法
- void clear():刪除該Map對象中所有的key-value對。也就是清理該集合;
- boolean containsKey(Object key):查詢Map中是否包含指定的key;
- boolean containsValue(Object value):查詢Map中是否包含至少一個value;
- Set entrySet():返回Map所包含的key-value對所組成的Set集合,每個集合元素都是Map.Entry對象(Entry是Map內部類);
- Object get(Object key):返回指定key所對應的value,若此Map中不包含該key,返回null;
- boolean isEmpty():判斷Map集合是否爲空;
- Set keySet():返回該Map中所有key所組成的Set集合;
- Object put(Object key,Object value):添加一個key-value對,若Map中已有與key相等的key-value對,則新的key-value對覆蓋原來的key-value對;
- void putAll(Map m):將m中的key-value賦值到調用該方法的Map對象中;
- Object remove(Object key):刪除指定key所對應的key-value對,返回本刪除key所關聯的value,若key不存在,返回null;
- int size():返回該Map裏面key-value對的個數;
- Collection values():返回Map裏所有value組成的Collection。
三、Map.Entry
- Entry是Map接口裏面的一個內部接口.
- 該接口用於封裝key- value,有3個方法:
- Object getKey();返回Entry裏包含的key值
- Object getValue();返回Entry裏包含的value值
- Object setValue(Object value):設置Entry裏包含的value值,並返回新設置的value值;
四、Map集合的輸出
- 按照最正統的做法,所有的Map集合的內容都要依靠Iterator輸出,以上雖然是完成了輸出,但是完成的不標準,Map集合本身並不能直接爲Iterator實例化,如果此時非要使用Iterator輸出Map集合中內容的話,則要採用如下的步驟:
方法一:
1.通過entrySet方法變成Set對象
2.調用Set的Iterator方法,此時每個Iterator對象是Map.Entry對象
3.對Map.Entry分離出 key - value
方法二:
1.通過keySet得到Map集合多有key的Set集合
2.調用Set的Iterator方法,此時每個Iterator對象是key值
3.通過Map的getValue(key)得到value值
五、Map集合常用類
- HashMap:線程不安全,速度快,允許存放null鍵,null值。類中的key都屬於無序存放的
- 即使HashMap線程不安全,在多線程中也推薦使用
- Collections類: public static Map synchronizedMap(Map m)來返回線程同步的映射;
- HashMap裏的key存儲和保存HashSet裏面的元素一致,若自定義類作爲HashMap或Hashtable的key:當兩個key對象的equals方法返回true時,兩個key對象的hashCode值也應一樣;
- TreeMap:對key進行排序,排序原理與TreeSet相同。
HashMap實例
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
Map map = new HashMap();
/**
* Map裏的key必須唯一,不然後續的會覆蓋前面的
*
* Entry是Map的內部接口: 表示一組映射關係
*
* Map裏key不記錄順序, 和 Set一樣;
*
*
*/
map.put("1", "A");
map.put("1", "C");
map.put("2", "B");
map.put("3", "C");
map.put(null, null);
System.out.println(map);
/**
* boolean containsKey(Object key) 如果此映射包含指定鍵的映射關係,則返回 true。
* boolean containsValue(Object value) 如果此映射將一個或多個鍵映射到指定值,則返回 true。
*/
System.out.println(map.containsKey("3"));
System.out.println(map.containsKey("33"));
System.out.println(map.containsValue("E"));
System.out.println(map.containsValue("C"));
/*
* Object get(Object key) 返回指定鍵所映射的值;如果此映射不包含該鍵的映射關係,則返回 null。
* */
Object v = map.get("3");
System.out.println(v);
/*
* void putAll(Map m)
從指定映射中將所有映射關係複製到此映射中(可選操作)。
* */
Map map2 = new HashMap();
map2.put("A", "春哥");
map2.put("C", "著姐");
map.putAll(map2);
System.out.println(map);
/*
* Object remove(Object key) 如果存在一個鍵的映射關係,則將其從此映射中移除(可選操作)。
* */
v = map.remove("A");
System.out.println(v);
System.out.println(map);
/**
* int size() 多少組映射關係(Entry)
*/
System.out.println(map.size());
/*
* Set entrySet() 返回此映射中包含的映射關係的 Set 視圖。
* */
Set entrys = map.entrySet();
for (Object o : entrys) {
if(o instanceof Map.Entry){
Map.Entry entry = ( Map.Entry) o;
/*
* Object getKey() 返回與此項對應的鍵。
Object getValue() 返回與此項對應的值。
Object setValue(V value) 用指定的值替換與此項對應的值(可選操作)。
* */
System.out.println("entry.key-->"+entry.getKey());
System.out.println("entry.value-->"+entry.getValue());
System.out.println("entry.setvalue-->"+entry.setValue("Will"));
System.out.println("entry.value-->"+entry.getValue());
}
}
System.out.println(map);
/*
* Set keySet() 返回此映射中包含的鍵的 Set 視圖。
* */
Set keys = map.keySet();
for (Object key : keys) {
System.out.println("key-->" + key);
System.out.println("value-->" + map.get(key));
}
/*
* Collection<V> values() 返回此映射中包含的值的 Collection 視圖。
* */
Collection vs = map.values();
for (Object val : vs) {
System.out.println("value=== " + val);
}
//==========================================
//Can only iterate over an array or an instance of java.lang.Iterable
/*for(Object obj : map){
}*/
}
}
六、TreeMap
- HashMap子類中的key都屬於無序存放的,如果現在希望有序(按key排序)則可以使用TreeMap類完成,但是需要注意的是,由於此類需要按照key進行排序,而且key本身也是對象,那麼對象所在的類就必須實現Comparable接口。
- 使用 HashMap的時候 key和 value都可以保存爲 nulll;
- 當 使用 TreeMap 的時候 key不能爲null,value可以是 null;
- TreeMap對key的排序方式:
- 自然排序;
- 定製排序;
- TreeMap判斷兩個key元素是否相等標準(和HashSet一樣):
- compareTo方法或compare方法返回0;
TreeMap實例
import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;
class A implements Comparable{
public int compareTo(Object o) {
return 0;
}
}
public class TreeMapDemo {
public static void main(String[] args) {
TreeMap m = new TreeMap();
m.put("3", "3");
m.put("7", "7");
m.put("-9", "-9");
m.put("A", "A");
System.out.println(m);
/**
* Map.Entry ceilingEntry(K key)
返回一個鍵-值映射關係,它與大於等於給定鍵的最小鍵關聯;如果不存在這樣的鍵,則返回 null。
*/
System.out.println(m.ceilingEntry("4"));
/**
* Map.Entry firstEntry()
返回一個與此映射中的最小鍵關聯的鍵-值映射關係;如果映射爲空,則返回 null。
*/
System.out.println(m.firstEntry());
m = new TreeMap();
//m.put("A", new A());
//m.put("A", new A());
m.put(new A(), "A");
m.put(new A(), "A");
m.put(new A(), "A");
m.put(new A(), "A");
/*
* 使用 HashMap的時候 key和 value都可以保存爲 nulll;
當 使用 TreeMap 的時候 key不能爲null,value可以是 null;
對象要調用 compreTo方法比較,
* */
m.put(null,null);
System.out.println(m);
//Map裏 key的定製排序
m = new TreeMap(new Comparator() {
public int compare(Object o1, Object o2) {
return 0;
}
});
/**
* HashSet HashMap
* TreeSet TreeMap
*
*
* 其實 Set和Map在底層有莫大的關係:
* 可以這樣理解:
* HashMap裏的key其實就是HashSet元素;
*
* public HashSet() {
map = new HashMap<>();
}
*/
}
}