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。