ArrayList,Hashmap,AVL三大容器总结(干货)

17 阅读2分钟

由于20多天高强度的学习,脊椎已经跟不上了,只能休息两天没写一行代码。我没看过源码,但是通过这两天跟豆包的反复复盘总结,现在应算是彻底吃透这三大容器的底层思想了。代码就不做重新更新对齐Java的核心设计理念了。最核心的重点是一定要学会位运算才能写出来最高效的代码,我现在用位运算写高效代码的功力还不够,没有完全吃透位运算,仅仅只是理解了位运算的机制。

1.ArrayList 主要是为了解决数组定义以后不能改变长度的痛点才设计的ArrayList。初始化的容量为10,核心是扩容因子的设计。每次扩容为原容量的1.5倍这样就保证了数组的容量问题,如果按2的倍数扩容内存压力过大容易撑爆内存。

2.Hashmap hash表是为了同时获得数组的快速查询效率,又获得链表的快速增删的效率的一种结合体。核心是数组扩容因子的定义以及哈希扰动的设计。数组初始化容量为最小为2的4次幂,外部传数组长度强制按2的幂初始化,这样能最高效率获得数组的下标进行下一步操作。哈希表最灵魂的设计是在哈希扰动,纯粹是为了不理解哈希扰动的程序员做的兜底。不重写hashCode方法就压根没有必要进行按位异或扰动。

3.AVL AVL二叉树是为了获得极致的查询速度牺牲了添加跟删除的速度而设计的。这个结构的灵魂之处是节点高度的定义,正常人的思维方式应该是按节点深度来定义,而Java的设计是每个节点的高度都是动态的,它的高度都是由它的子节点的高度决定的相对高度。这样就能附带的获得一个副产品平衡因子(左孩子高度 - 右孩子高度)。能想通这里,失衡旋转就只是水到渠成的事,只不过需要自己对指针操作相当熟悉就行了。