Hashmap
对key进行hash,放到数组对应的位置 p = tab[i = (n - 1) & hash] 。i的位置为i = (n - 1) & hash
从JDK8以后结构为:数组 + 链表 + 红黑树,从原来的hash冲突时由纯链表变为,当链表长度大于8以后变为红黑树。
fail-fast机制是什么东西,这个在开发的时候是一个比较常见的异常,ConcurrentModificationException
核心变量 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 //应该是数组的默认的初始大小,是16,这个跟ArrayList是不一样的,初始的默认大小是10 //这个数组的大小,一般会自己手动指定一下,就跟你用ArrayList一样,你需要去预估一下你的这个数据结构里会放多少key-value对,指定的大一些,避免频繁的扩容 static final float DEFAULT_LOAD_FACTOR = 0.75f; //默认的负载因子,如果你在数组里的元素的个数达到了数组大小(16) * 负载因子(0.75f),默认是达到12个元素,就会进行数组的扩容 static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; } //这是一个很关键的内部类,他其实是代表了一个key-value对,里面包含了key的hash值,key,value,还有就是可以有一个next的指针,指向下一个Node,也就是指向单向链表中的下一个节点 //通过这个next指针,就可以形成一个链表 transient Node<K,V>[] table; //这个是什么东东?Node<K, V>[],这个数组就是所谓的map里的核心数据结构的数组,数组的元素就可以看到是Node类型的,天然就可以挂成一个链表,单向链表,Node里面只有一个next指针 transient int size; //这个size代表的是就是当前hashmap中有多少个key-value对,如果这个数量达到了指定大小 * 负载因子,那么就会进行数组的扩容 int threshold; //这个值,其实就是说capacity(就是默认的数组的大小),就是说capacity * loadFactory,就是threshold,如果size达到了threshold,那么就会进行数组的扩容,如果面试这么回答,你就是在打自己的脸。扩容的时机是size>threshold //负载因子,默认值,threshold,扩容,扩容,rehash的算法,JDK 1.……
阅读全文