HashMap

来源:互联网 发布:自由游戏程序员 编辑:程序博客网 时间:2024/05/17 23:02
public class HashMap<K,V> extends AbstractMap<K,V>  implements Map<K,V>, Cloneable, Serializable {      ...      static class Node<K,V> implements Map.Entry<K,V> {          ...      }      final class KeySet extends AbstractSet<K> {          ...      }      final class Values extends AbstractCollection<V> {          ...      }      final class EntrySet extends AbstractSet<Map.Entry<K,V>> {          ...      }      abstract class HashIterator {          ...      }      final class KeyIterator extends HashIterator implements Iterator<K>  {          ...      }      final class ValueIterator extends HashIterator implements Iterator<V> {            ...        }      final class EntryIterator extends HashIterator        implements Iterator<Map.Entry<K,V>> {            ...        }      static class HashMapSpliterator<K,V> {            ...        }      static final class KeySpliterator<K,V>        extends HashMapSpliterator<K,V>        implements Spliterator<K> {            ...        }      static final class ValueSpliterator<K,V>        extends HashMapSpliterator<K,V>        implements Spliterator<V> {            ...        }      static final class EntrySpliterator<K,V>        extends HashMapSpliterator<K,V>        implements Spliterator<Map.Entry<K,V>> {            ...        }      static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {            ...        }  }

基于哈希表并实现Map接口。这个实现提供了map的所有操作,并允许key和value为null值。这个类并不保证映射的顺序,也不保证映射的顺序是一直不变的。

HashMap 和 Hashtable 很像,它们的区别在于是否同步和是否允许null值。

如果哈希函数可以将元素恰当的分散在桶中,那么它可以保证基本的操作时常数时间O(1)的(如get、put)。集合迭代需要的时间和HashMap的容量成正比O(Capacity* Number of key-value)。所以,当iteration很重要的时候,不能将Capacity初始值设置太高。

HashMap有两个参数对它的表现影响很大:初始容量(Capacity)和装填因子(load factor)。

初始容量默认值值为16,装填因子为0.75。这里,容量的值必须为2的,原因稍后解释。

多个Key值的hashCode()可能为同一值,为了改善此时的性能,当Key是Comparabl时,使用比较来进行排序。

HashMap不是同步的,不是线程安全的。当需要多个线程对HashMap执行并发操作时,需要外部加锁同步,或者使用其他封装的同步的Map类,或者利用Collections.synchronizedMap对HashMap进行封装。

Iterator是fail-fast。

0 0
原创粉丝点击