开头
Netty 作为当前流行的 NIO 框架,在游戏、大数据通讯,云计算、物联网等领域都有广泛的应用,大家熟知的 Dubbo,底层用的就是 Netty。尤其在高性能 RPC 方面,Netty 更是必不可少。然而,想要将 Netty 真正掌握并精通难度却不小。一些学习者可能会遇到这些问题:
- 多线程编程、Socket 通信、TCP/IP 协议栈等知识掌握不扎实,学习过程比较吃力;
- 学习了不少理论知识,但真正跟具体项目结合在一起,解决实际问题时,又感觉比较棘手;
- 调用过程中遇到问题,不会定位,基本靠网上搜索,效率很低。
因此,如果没有一个好的学习方法,抓不住重点,只靠阅读源码,既耗时又很难吃透,很容易半途而废。
扩容是发生在添加操作前的,要保证要添加元素在 elementData 数组中有位置,也即是 size 加上要添加的元素个数要小于 capacity(size + num <= capacity 就说明容量是充足的),所以在添加方法中,先调用 ensureCapacityInternal(int) 方法来确保 elementData 容量充足,然后再进行具体的添加操作。如果 ensureCapacityInternal 方法(ensureCapacityInternal 方法中有调用了其他方法)发现数组容量不够了,就会扩容。扩容实际的方法是 grow(int) 方法,使用位运算符来使数组的容量扩容 1.5 倍。但是需要注意的是,没有指定初始化值的 ArrayList 空实例,第一次扩容并不是以 1.5 倍扩容的,而是使用的默认容量 10,所以网上很多直接说 ArrayList 扩容是 1.5 倍也有不当之处,这点从 JDK 源码中可以很明确的看出来。
如果在构造 ArrayList 实例时,指定初始化值(初始化容量或者集合),那么就会创建指定大小的 Object 数组,并把该数组对象的引用赋值给 elementData;如果不指定初始化值,在第一次添加元素值时会使用默认的容量大小 10 作为 elementData 数组的初始容量,使用 A

本文详细解析了Java ArrayList的扩容机制,强调在添加元素前通过ensureCapacity优化性能,指出扩容并非始终按1.5倍增长,并讨论了Arrays.copyOf与System.arraycopy的区别。此外,还提供了针对大量add操作的性能提升建议。

286

被折叠的 条评论
为什么被折叠?



