HashMap

JDK1.7:

ArrayList 内部是数组结构

HashMap_第1张图片

LinkeList内部是链表结构

HashMap_第2张图片

TreeMap 是二叉树结构

HashMap_第3张图片

HashMap 是数组+链表

HashMap_第4张图片

HashMap_第5张图片

读取(put)慢 会读取所有的key 确定有没有重复,通过hash优化

HashMap_第6张图片

Hash碰撞时两个不同的Key 取模时 得到了一样的key

HashMap_第7张图片

通过链表进行存放

初始大小 1 << 4 ,16 ------和满载率0.75

如果初始化小于0- -1则会抛异常,如果超出大小则取 1 << 30 = 10E

满载率如果小或者null也会抛异常

然后执行init

new HashMap 并没有创建,而是声明一个数组

HashMap_第8张图片

HashMap_第9张图片

HashMap_第10张图片

HashMap_第11张图片

HashMap_第12张图片

HashMap_第13张图片

HashMap 动态扩容,比原先大一倍 16X2,number X 2

HashMap_第14张图片

HashMap_第15张图片

将数组第一位取值判断,为null 返回旧的值,如果没找到则添加元素,

多线程中访问不是安全的

HashMap_第16张图片

 key相同 返回旧的值,存新的值

HashMap_第17张图片

创建新节点,然后把原先的放到新节点,把旧的数据放到数组最后面

HashMap_第18张图片

HashMap_第19张图片

2*resize 扩容大小

HashMap_第20张图片

HashMap_第21张图片transfer 拷贝数据引用

HashMap_第22张图片

get

HashMap_第23张图片

key = null 查找key forNull 会一直在第一个位置

HashMap_第24张图片

通过hash ,索引查找列表,判断hash是否相等,地址是否相等 equals

数据结构 -- 数组+链表

first insert

hash冲突会执行二次哈希,通过链表

默认容量16,会执行位运算

内部数组是第一次put时候创建的,new HashMap 不会创建

JDK1.8+

默认容积依旧是16

onlyIfAbsent true / false  有相同key 覆盖旧值, evict true /false 容积在创建中

HashMap_第25张图片

table = null 初始化 (resize),第一次添加元素创建数组

HashMap_第26张图片

如果新的元素为null 则创建新的节点,并且添加到next

达到容量先添加元素再扩容,1.7则先扩容再添加元素

//put 判断table 为Null则创建

HashMap_第27张图片

HashMap_第28张图片

HashMap_第29张图片

HashMap_第30张图片

HashMap_第31张图片

TreeNode 红黑树

数组长度不到64 会进行扩容,否则执行树化,红黑树

扩容,如果在旧数组Index= 1 ,新的数组则为1 或者17

1.8之后数据从尾部插入

拷贝数据则对旧数组进行与运算

列表长度大于8的时候转为红黑树,判断链表是否大于64,然后转红黑树

你可能感兴趣的:(java,开发语言)