您的位置:首页 > 其它

HashTable HashMap和LinkedHashMap

2014-08-10 23:25 148 查看
(1)关于HashTable和HashMap的区别,在HashMap的源码里有一段话讲得非常清楚。The HashMap class
is roughly equivalent to Hashtable , except
that it is unsynchronized and permits nulls.也就是HashMap 不是线程安全的,且允许key和value的值为null。
(2)接下来看看HashMap的具体实现,透过下面的数据结构,知道HashMap就是一个数组,数组元素是一个个链表。
(a)transient Entry[] table;

(b)static class Entry<K,V> implements Map.Entry<K,V>
{
[align=left] final K key;[/align]
[align=left] V value;[/align]
[align=left] Entry <K,V> next ;[/align]
[align=left] final int hash;[/align]

[align=left] }[/align]
[align=left] Entry保存了key,value,hash的值,同是指向下一个Entry。[/align]
[align=left] HashMap是如何保存元素的?[/align]

[align=left] public V put(K key, V value) {[/align]
[align=left] if (key == null)[/align]
[align=left] return putForNullKey(value);[/align]
[align=left] //通过这里我们看到在写对象时重载hashCode()的意义[/align]
[align=left] int hash = hash(key.hashCode());[/align]
[align=left] //计算出将要存放到数组的位置[/align]
[align=left] int i = indexFor(hash, table .length );[/align]
[align=left] //如果不为null,那么进行更新[/align]
for (Entry<K,V> e = table[i];
e != null; e = e. next)
{
[align=left] Object k;[/align]
if (e. hash ==
hash && ((k = e. key) == key || key.equals(k))) {
[align=left] V oldValue = e. value;[/align]
[align=left] e. value = value;[/align]
[align=left] e.recordAccess( this);[/align]
[align=left] return oldValue;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] modCount++;[/align]
[align=left] //添加新元素[/align]
[align=left] addEntry(hash, key, value, i);[/align]
[align=left] return null;[/align]
[align=left] }[/align]
[align=left](3)最后来看看LinkedHashMap的具体实现[/align]

This implementation differs from <tt>HashMap </tt> in
that it maintains a doubly- linked list running through all
of its entries. This linked list defines the iteration ordering, which is normally the order in which keys were inserted into the map ( <i>insertion -order </i>).

[align=left] public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>可以看出LinkedHashMap是HashMap的子类,透过上面的一段话,LinkedHashMap保留了元素的插入顺序,同时不受重复插入的影响。HashMap肯定是散列函数决定元素顺序。[/align]
[align=left] LinkedHashMap包含一个双向链表private transient Entry<K,V> header;[/align]

[align=left]具体见 http://zhangshixi.iteye.com/blog/673789[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: