1、HashMap的高效率应用:使用map.entrySet(),而非keySet
map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
val = entry.getValue();
}
HashMap是随机输出的,要想实现按输入的顺序来输出,在声明时候直接替换成new LinkedHashMap(),但是LinkedHashMap/Set也不是线程安全的。如果在多线程下访问,可以使用java代码Collections.synchronizedMap()的方法包装成一个线程安全的Map/Set
public static Map<String, Object> SESSION_MAP = Collections.synchronizedMap(new HashMap<String, Object>());
2、Hashtable和HashMap对比
都实现了Map接口,但Hashtable同时继承自Dictionary抽象类。
1) Hashtable中,无论是key还是value都不能为null 。
而HashMap中,null可以为key也可以为value,但只能有一个key为null,可以有一个或多个value为null。 当get()方法返回null时,既可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中判断是否存在某个键,应该用containsKey(key)来代替get(key)。
2)Hashtable是线程安全的,它的方法是全部加了锁实现了同步,使用率不高,因为效率比较低。
3)HashMap线程不安全,在多线程环境中,通过Collections.synchronizedMap对HashMap进行包装,如果并发性不是特别高的时候可以使用
4)如果是高并发且要求返回容器排序可以使用ConcurrentSkipListMap
5)线程安全的ConcurrentHashMap
Hashtable中采用的锁机制是一次锁住整个hash表,从而同一时刻只能由一个线程对其进行操作;
ConcurrentHashMap默认将hash表分为16个桶,一次锁住一个桶,诸如get,put,remove等常用操作只锁当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。
4、Queue接口与List、Set同一级别,都是继承了Collection接口。Queue是以先进先出的方式排序各个元素,使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用peek()来获取头元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。参考LinkedBlockingQueue的api
如果你试图向一个已经满了的阻塞队列中添加一个元素或者是从一个空的阻塞队列中移除一个元索,将导致线程阻塞。在多线程进行合作时,阻塞队列是很有用的工具。队列会自动平衡负载。remove、element、offer 、poll、peek 其实是属于Queue接口。
在多线程程序中,队列在任何时间都可能变成满的或空的,所以你可能想使用offer、poll、peek方法,这些方法在无法完成任务时只是给出一个出错示而不会抛出异常。 注意:poll和peek方法出错进返回null。因此,向队列中插入null值是不合法的。