前言:特别注意,Map不是Collection接口的实现或子类,而是一个独立的接口,Map接口的实现有:Hashtable,LinkedHashMap,HashMap,TreeMap。
HashMap:
性质:最常用的Map,父类是AbstractMap,根据key的HashCode值来存储数据,根据key可以直接获取它的value,最多允许一条记录的key值为null(多条会覆盖),允许多条记录的value值为null。
优点:访问速度快。
缺点:无序,不同步,线程不安全。
Hashtable:
性质:与 HashMap类似,其父类是Dictionary,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写 Hashtable,因此也导致了Hashtale在写入时会比较慢。
优点:同步,线程安全。
缺点:无序,效率低。
TreeMap:
性质:能够把保存的记录根据key值排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。
优点:有序。
缺点: 不同步,线程不安全。
LinkedHashMap:
性质:保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢。key和value均允许为null。
优点:有序,FIFO。
缺点: 不同步,线程不安全。
样例:
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.TreeMap;
public class MapUtil {
/**
* test
*
* @param args
*/
public static void main(String args[]) {
HashMap<String, Object> hashMap = new HashMap<String, Object>();
Hashtable<String, Object> hashTable = new Hashtable<String, Object>();
TreeMap<String, Object> treeMap = new TreeMap<String, Object>();
LinkedHashMap<String, Object> linkMap = new LinkedHashMap<String, Object>();
String[][] strs = { { "abd", "abd" }, { "abc", "abc" },
{ "abac", "abac" }, { "bcd", "bcd" }, { "bce", "bce" },
{ "bac", "bac" }, { "def", "def" }, { "dea", "dea" },
{ "efghddd", "efghddd" }, { "efghdda", "efghdda" } };
for (String[] s : strs) {
hashMap.put(s[0], s[1]);
hashTable.put(s[0], s[1]);
treeMap.put(s[0], s[1]);
linkMap.put(s[0], s[1]);
}
System.out.println("HashMap 无序:\n " + hashMap.values());
System.out.println("Hashtable 无序:\n " + hashTable.values());
System.out.println("TreeMap 有序:\n " + treeMap.values());
System.out.println("LinkedHashMap FIFO:\n " + linkMap.values());
}
}
输出:
HashMap 无序:
[dea, abc, abd, def, efghddd, abac, efghdda, bcd, bac, bce]
Hashtable 无序:
[def, bac, dea, bce, bcd, abd, efghddd, abc, efghdda, abac]
TreeMap 有序:
[abac, abc, abd, bac, bcd, bce, dea, def, efghdda, efghddd]
LinkedHashMap FIFO:
[abd, abc, abac, bcd, bce, bac, def, dea, efghddd, efghdda]