HashMap & Hashtable 区别
a.HashMap不是线程安全的;HashTable是线程安全的,其线程安全是通过Sychronize实现。
b.由于上述原因,HashMap效率高于HashTable。
c.HashMap的键可以为null,HashTable不可以。
d.多线程环境下,通常也不是用HashTable,因为效率低。HashMap配合Collections工具类使用实现线程安全。同时还有ConcurrentHashMap可以选择,该类的线程安全是通过Lock的方式实现的,所以效率高于Hashtable。
Iterator模式可以把访问逻辑从不同类的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
遍历HashMap
//遍历方式一:for each遍历HashMap的entryset,注意这种方式在定义的时候就必须写成
//Map<Integer , String> hs,不能写成Map hs;
for(Entry<Integer , String> entry : hs.entrySet()){
System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());
}
//遍历方式二:使用EntrySet的Iterator
Iterator<Map.Entry<Integer , String>> iterator = hs.entrySet().iterator();
while(iterator.hasNext()){
Entry<Integer , String> entry = iterator.next();
System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());
};
//遍历方式三:for each直接使用HashMap的keyset
for(Integer key : hs.keySet()){
System.out.println("key:"+key+" value:"+hs.get(key));
};
//遍历方式四:使用keyset的Iterator
Iterator keyIterator = hs.keySet().iterator();
while(keyIterator.hasNext()){
Integer key = (Integer)keyIterator.next();
System.out.println("key:"+key+" value:"+hs.get(key));
}
}
虽然使用keyset及entryset来进行遍历能取得相同的结果,
但两者的遍历速度是有差别的。
keySet():迭代后只能通过get()取key
entrySet():迭代后可以e.getKey(),e.getValue()取key和value。返回的是Entry接口
说明:keySet()的速度比entrySet()慢了很多,也就是keySet方式遍历Map的性能不如entrySet性能好
为了提高性能,以后多考虑用entrySet()方式来进行遍历。
ArrayList,LinkedList一个无序,一个有序;
HashSet,TreeSet一个无序,一个有序;
HashMap,LinkedHasmMap,一个无序,一个有序;
Vector和HashTable,Stack是线程安全的,但是效率低;
线程不安全的类都可以配合Collections得到线程安全的类。