HashMap中当链表元素>8时扩容但是当数组主体>64时,会变成红黑树
HashMap默认长度为16,存取无序,键和值的位置可以是null,但键是唯一的
数据结构是计算机存储数据、组织数据的方式
ArrayList集和底层的数据结构是数组,查询快,增删慢
LinkedList集合底层的数据结构是链表,查询慢,增删快
HashMap的put方法用来放入数据 具有修改覆盖功能
在第一次调用put方法时创建数组 Node[]table,运用HashCode算出值,结合数组
长度采用算法存储空间的索引值,例如:给长度取余,如果计算出的索引空间没有数据,则直接存储到数组中
HashMap<String,Tnteger>hm = new HashMap<>();
Hm.put(“key”,值)
算法:(位运算)无符号右移(>>>)、按位异或(^)、按位与(&)计算索引
平方取中法、取余法(效率最低)、伪随机数法
索引值是通过对数据进行HashCode计算所得的值与数组长度进行取余后所得的值
Hash%length
如果两个数据的索引一样,但是哈希值不一样,则在此空间上划出一个节点,对数据进行存储,称为拉链法
如果哈希值一样,此时发生哈希碰撞,就会调用数据所属类的equals方法比较内容是否相等,相等则用后添加的数据的value覆盖之前的value,不相等则继续向下比较键,如果都不相等,则划出一个节点存储数据
内容不同,哈希值也有可能相同
例如单链表有n个元素,遍历的时间复杂度就是O(n),而此时的红黑树遍历的时间复杂度则是O(logn)
Size指的是数组里实时存储数据的数量,不等于数组table长度,每次执行++
Serializable接口说明HashMap是可以完成序列化和反序列化 UID编译
位运算Hash&length-1 可以减少哈希碰撞,让数组空间均匀分配
按位与运算:相同的二进制数位上,都是1的时候,结果为1,否则为0
如果数组长度不是的2的n次幂,计算出的索引特别容易相同,及其容易发生Hash碰撞,导致其余数组的空间很大程度上并没有存储数据,链表或红黑树过长,效率降低
HashMap继承抽象类
集合的初始化容量DEFAULT INITIAL CAPACITY 1<<4也就是16,必须是二的n次幂
Default 默认 initial初始
DEFAULT LOAD FAVTOR=0.75f 称之为加载因子,当大于默认指的75%时,会自动扩容
LOAD FAVTOR 用来权衡集合的疏密程度>0&&<1
MAXMUM CAPACITY =2的30次幂 集合的最大容量
TREEIFY THRESHOLD=8 当链表上的节点数大于8是会形成红黑树,红黑树的节点空间是链表节点空间的两倍,通过泊松分布算出当链表节点到8时概率极低,只是一种对于时间、空间、效率的权衡
UNTREEIFY THRESHOLD = 6当节点小于6时,会从红黑树转换为链表
Node[]table存储键值对