HashMap
类图
一、成员变量
//静态成员:
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;// aka 16,默认的容器大小16
static final int MAXIMUM_CAPACITY = 1 << 30;//容器最大为2的30次方
static final float DEFAULT_LOAD_FACTOR = 0.75f;//默认因子为0.75f
static final int TREEIFY_THRESHOLD = 8;//临界值,大于2小于8,当链表长度大于8时,就会转为红黑树
static final int UNTREEIFY_THRESHOLD = 6;//扩容的时候红黑树分割后,如果大于6则保留红黑树结构,否则使用链表
static final int MIN_TREEIFY_CAPACITY = 64;//使用红黑树结构的最小容量
//非静态成员:
transient Node<K,V>[] table; //储存元素的node数组,每个node储存了一个key和value,hash。和一个另一个node的引用
transient Set<Map.Entry<K,V>> entrySet;//也是储存了所有元素
transient int size; //容器大小
transient int modCount; //修改的版本
int threshold;//临界点,是大于初始化Capacity的值得最小二次幂数
final float loadFactor; //负载因子
二、构造器
public HashMap(int initialCapacity, float loadFactor) //初始化容器大小和负载因子
public HashMap(int initialCapacity) //使用默认负载因子,0.75
public HashMap() //使用默认大小16和负载因子0.75
public HashMap(Map<? extends K, ? extends V> m) //使用map来初始化当前容器
三、部分方法
put()//方法计算数组下标值是通过hash值&(数组长度-1),值得范围就在0~(数组长度-1)
//hash方法,计算哈希值,(h = key.hashCode()) ^ (h >>> 16);
hash(key)
resize() //扩容方法
如果是简单的node,没有使用树,则扩容如下:
四、内部类
static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V>//红黑树节点
static class Node<K,V> implements Map.Entry<K,V> //储存元素节点
abstract class HashIterator //抽象类,用于遍历的hashmap的迭代器
static class HashMapSpliterator<K,V> //分割并发遍历操作使用
final class Values extends AbstractCollection<V> //相当于储存了value的collection,用HashMap的values()得到
final class ValueIterator extends HashIterator //用于遍历map的value,Values 的iterator()得到
static final class ValueSpliterator<K,V> //分割并发遍历操作value列表
final class EntrySet extends AbstractSet<Map.Entry<K,V>> //相当储存了key,value的set,用HashMap的entrySet()得到
final class EntryIterator extends HashIterator //用于遍历map的每个元素,EntrySet的iterator()得到
static final class EntrySpliterator<K,V> //分割并发遍历操作entrySet列表
final class KeySet extends AbstractSet<K> //相当于储存了key的set,用HashMap的keySet()得到
final class KeyIterator extends HashIterator //用于遍历map的key,用KeySet 的iterator()得到
static final class KeySpliterator<K,V> //分割并发遍历操作value列表
Map<String,String> hashMap = new HashMap<String,String>();
hashMap.put("1", "444");
hashMap.put("2", "123");
//直接用foreach迭代器遍历
Collection<String> vi = hashMap.values();
for(String v : vi){
System.out.println(v);
}
Set<String> si = hashMap.keySet();
for(String s : si){
System.out.println(s);
}
Set<Map.Entry<String, String>> ei = hashMap.entrySet();
for(Map.Entry<String, String> e : ei){
System.out.println(e);
}