1.定義
Collection接口是保存單值的最大父接口,Map接口則是保存一對值.全部的內容是以key--->value的形式保存的.Map接口經常使用的子類有三個. java
- HashMap
- HashTable
- TreeMap
2.新的子類HashMap
示例1: 安全
package com.ares.mapdemo; import java.util.HashMap; import java.util.Map; public class HashMapDemo01 { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("zhangsan", 1); map.put("zhangsan", 2); map.put("lisi", 3); map.put("wangwu", 5); System.out.println(map) ; } }
輸出結果: {zhangsan=2,lisi=3,wangwu=5} 異步
注:HashMap中key不容許有重複的值,因此當屬性重複時會被覆蓋.其最大的特色是用於內容的查找,查找成功則返回內容,不然返回空. 性能
查找操做: Integer value = map.get("zhangsan") ; 學習
示例2:將Map中的key所有以Set的集合的形式返回. this
Map<String, Integer> map = new HashMap<String, Integer>(); map.put("zhangsan", 1); map.put("zhangsan", 2); map.put("lisi", 3); map.put("wangwu", 5); Set<String> set = map.keySet(); // 返回所有的key Iterator<String> iter = set.iterator(); while (iter.hasNext()) { System.out.println(iter.next()); }
注:注意的是重複的key內容仍然不會顯示,會被過濾掉.HashMap中key也是散列的. spa
示例3:將Map中的value以Collection集合形式返回. 線程
Map<String, Integer> map = new HashMap<String, Integer>(); map.put("zhangsan", 1); map.put("zhangsan", 2); map.put("lisi", 3); map.put("wangwu", 5); Collection<Integer> col = map.values();// 取得所有value Iterator<Integer> iter = col.iterator(); while (iter.hasNext()) { Integer value = iter.next(); System.out.println(value); }
3.舊的子類HashTable
HashTable與Vector的產生時代是同樣的,也屬於最先的集合操做類,以後擴展了其應用實現了Map接口. code
使用上與HashMap相像. orm
示例:
Map<String, Integer> map = new Hashtable<String, Integer>(); map.put("zhangsan", 1); map.put("zhangsan", 2); map.put("lisi", 3); map.put("wangwu", 5); System.out.println(map);
HashMap與HashTable的區別:
兩者都是Map接口的子類.HashMap採用的是異步的處理操做,而HashTable是同步,因此HashMap性能較高,HashTable是線程安全的.
4.TreeMap類
TreeMap是按key排序的輸出.
Map<String, Integer> map = new TreeMap<String, Integer>(); map.put("A、zhangsan", 1); map.put("A、zhangsan", 2); map.put("C、lisi", 3); map.put("B、wangwu", 5); Set<String> set = map.keySet(); // 返回所有的key Iterator<String> iter = set.iterator(); while (iter.hasNext()) { String key = iter.next(); System.out.println(key + " --> " + map.get(key)); }
輸出是根據key排序後的結果,分別是A,B,C.若是是給定的任意的類要直接排序則須要實現Comparable接口.
5.注意事項
5.1 Map不能直接使用Iterator輸出
要想輸出須要藉助Set,標準操做格式以下
示例:
package com.ares.iteartordemo; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class IteartorMapDemo { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("zhangsan", 1); map.put("zhangsan", 2); map.put("lisi", 3); map.put("wangwu", 5); Set<Map.Entry<String, Integer>> allSet = null; //經過Set來完成 allSet = map.entrySet(); Iterator<Map.Entry<String, Integer>> iter = allSet.iterator(); while (iter.hasNext()) { Map.Entry<String, Integer> me = iter.next(); System.out.println(me.getKey() + " --> " + me.getValue()); } } }
另外也能夠用foreach輸出:
for (Map.Entry<String,Integer> me : map.entrySet()) { System.out.println(me.getKey() + " --> " + me.getValue()); }
5.2使用非系統類做爲key
示例1:
Map<String, Person> map = new HashMap<String, Person>(); map.put(new String("zs"), new Person("張三", 30)); System.out.println(map.get("zs")); //System.out.println(map.get(new String("zs"))); //均可以打印出:Person的toString方法.
在Map中能夠經過一個匿名對象找到key對應的value.
示例2:
Map<Person, String> map = new HashMap<Person, String>(); map.put(new Person("張三", 30), "zs"); System.out.println(map.get(new Person("張三", 30))); //但這個卻不能打印出:Person的toString方法.結果爲null
這樣子卻找不到key對應的value.爲何示例一的String就能夠呢?
這裏須要注意的是須要在Person類中覆寫equals()方法和hasHashCode()方法來區分是不是同一個對象.
也就是說只要是非系統類做爲key操做的話就必須覆寫,不然會找不到.
示例:
package org.lxh.mapdemo; public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof Person)) { return false; } Person p = (Person) obj; if (this.name.equals(p.name) && this.age == p.age) { return true; } else { return false; } } public int hashCode() { // 這個方法的返回值都是經過一個公式計算的 // 此時的公式:名字的hashCode * age return this.name.hashCode() * this.age; } public String toString() { // 覆寫toString() return "姓名:" + this.name + ";年齡:" + this.age; } }
5.3 其餘子類: IdentityHashMap
通常正常狀況下,Map集合中的key是不能重複的,這種作法是Map的標準作法,但在集合中提供了一種非正常的操做類:IdentityHashMap,只要對象地址不一樣,則能夠重複加.
示例:
package com.ares.mapdemo; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class IdentityHashMapDemo { public static void main(String[] args) { Map<String, Integer> map = new IdentityHashMap<String, Integer>(); map.put(new String("zhangsan"), 1); map.put(new String("zhangsan"), 2); Set<String> set = map.keySet(); // 返回所有的key Iterator<String> iter = set.iterator(); while (iter.hasNext()) { String key = iter.next(); System.out.println(key + " --> " + map.get(key)); } } }
須要注意的是若是用的是HashMap則只會輸出一個key-value.
20150519
JAVA學習筆記系列
--------------------------------------------
聯繫方式
--------------------------------------------
Weibo: ARESXIONG
E-Mail: aresxdy@gmail.com
------------------------------------------------