哈希表:数组+链表+红黑树;
哈希值: 十进制的地址值
哈希表:
JDK1.8之前:数组+链表
JDK1.8以后:
数组+链表:同一个哈希值下的元素少于等于8个
数组+红黑树:同一个哈希值下的元素多余8个
哈希表是java.util.HashMap$Node类型的数组(Node是链表结构,,这样的话每一个索引值下可能会有多个元素。所以底层是哈希表的实现类基本都没有索引值)
数组的长度是:16
什么时候扩容:1,同一索引值下元素个数>8,并且数组长度<64;
2,数组的索引值占有率>0.75;
扩容的规则:新数组容量==旧数组容量左移一位(<<1-----; 旧数组*2);
同一索引值下元素个数>8,并且数组长度>=64.会把该索引值位置的元素转为红黑树;
哈希表判断两个元素是否重复的规则:
1: 哈希值是否相同 && (地址值相同 || equals相同)
Set<E>接口和Map<K,V>接口下几个常用实现类底层就用到了哈希表:
Set接口常用实现类:
1,HashSet:底层是哈希表(数组+链表/红黑树)。无序
2,LinkedHashSet:底层是链表+哈希表。有序
Map接口常用实现类:
1,HashMap:无序。底层的数据结构是哈希表
2,LinkedHashMap:有序。底层的数据结构是链表+哈希表