HashMap、HashTable、ConcurrentHashMap、Queue

来源:互联网 发布:wep破解软件下载 编辑:程序博客网 时间:2024/05/22 12:55

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是随机输出的,要想实现按输入的顺序来输出,需要用到HashMap的子类LinkedHashMap。所以,在声明时候直接替换成new LinkedHashMap()

LinkedHashMap/Set也不是thread-safe的。如果在多线程下访问,是需要进行外部同步,
或者使用Java代码 Collections.synchronizedMap()的方法包装成一个thread-safe的Map/Set

2.Hashtable和HashMap都实现了Map接口,但是Hashtable的实现是基于Dictionary抽象类。

在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。 

当get()方法返回null值时,既可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。

因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
而在Hashtable中,无论是key还是value都不能为null 。

这两个类最大的不同在于:
(1)Hashtable是线程安全的,它的方法是同步了的,可以直接用在多线程环境中。
(2)而HashMap则不是线程安全的。在多线程环境中,需要手动实现同步机制。


3.ConcurrentHashMap提供了和Hashtable以及SynchronizedMap中所不同的锁机制。
Hashtable中采用的锁机制是一次锁住整个hash表,从而同一时刻只能由一个线程对其进行操作;
而ConcurrentHashMap中则是一次锁住一个桶。
ConcurrentHashMap默认将hash表分为16个桶,诸如get,put,remove等常用操作只锁当前需要用到的桶。
这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。


4.Queue接口与List、Set同一级别,都是继承了Collection接口。Queue是以先进先出的方式排序各个元素,使用时要尽量避免Collection的add()和remove()方法,

而是要使用offer()来加入元素,使用peek()来获取头元素,使用poll()来获取并移出元素。

它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。

peek       返回队列头部的元素      如果队列为空,则返回null
remove   移除并返回队列头部的元素  如果队列为空,则抛出一个NoSuchElementException异常
offer       添加一个元素并返回true 如果队列已满,则返回false



如果你试图向一个已经满了的阻塞队列中添加一个元素或者是从一个空的阻塞队列中移除一个元索,将导致线程阻塞.
在多线程进行合作时,阻塞队列是很有用的工具。队列会自动平衡负载。
remove、element、offer 、poll、peek 其实是属于Queue接口。 


在多线程程序中,队列在任何时间都可能变成满的或空的,所以你可能想使用offer、poll、peek方法。
这些方法在无法完成任务时只是给出一个出错示而不会抛出异常。 
注意:poll和peek方法出错进返回null。因此,向队列中插入null值是不合法的。 

0 0