映射表(map)用来存放键/值对,如果提供了键,就能够找到对应的值。一个映射不能包含重复的键;每个键最多只能映射一个值,因为如果key相同,新的value将取代旧的
java类库为映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap
- 1.hashmap中元素的排列顺序是随机的
TreeMap按键值排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。散列或比较函数只能作用于键,与键关联的值不能进行散列或 比较
LinkedHashMap按照插入元素项的顺序排序
注:方法: LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder): 构建一个拥有特定容量、加载因子和访问顺序排序的空的链接哈希映像
如果将accessOrder设置为true,链接散列映像将用访问顺序,而不是插入顺序,对映射表条目进行迭代。每次调用get或者put方法时,受影响的条目将从当前位置上删除,然后放到链表的尾处。(只有条目在链表中的位置受到影响,而散列表元不受影响,一个表元总位于与键散列码对应的哈希表元中)。访问顺序对于实现高速缓存的“最近最少使用”原则十分重要。
- 2.hashmap、hashtable性能好些,是基于hash;treemap是基于红黑树(一种自平衡二叉查找树)实现的,性能较差。
在Map 中插入、删除和定位元素,HashMap 是最好的选择。
如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。
- 3.HashTable的方法是同步的,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。treemap、HashMap不支持线程的同步,即任一时刻可以有多个线程同时写treemap/HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronized方法使treemap/HashMap具有同步的能力.
- 4.HashTable,TreeMap不允许null值,key和value都不可以,HashMap允许null值,key和value都可以,但只能由一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。
- 5.HashTable使用Enumeration,HashMap使用Iterator。
- 6.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
- 7.LinkedHashMap在遍历的时候比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
public class HashMapTest {
public static void printPL(Map hm) {
Set s = hm.keySet();
Iterator i = s.iterator();
while(i.hasNext()) {
Object o = i.next();
System.out.println(o +" -- "+hm.get(o));
public static void printPL(Map hm) {
Set s = hm.keySet();
Iterator i = s.iterator();
while(i.hasNext()) {
Object o = i.next();
System.out.println(o +" -- "+hm.get(o));
/*或者
Map.Entry o = (Map.Entry)i.next();
System.out.println(o.getKey() +" -- "+o.getValue());
System.out.println(o.getKey() +" -- "+o.getValue());
*/
}
}
public static void main(String[] args) {
HashMap hm = new HashMap();
hm.put("ha0",new Integer(1000));
hm.put("ha1",new Integer(1001));
hm.put("ha2",new Integer(1002));
hm.put("ha3",new Integer(1003));
printPL(hm);
}
}