| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 阅读ArrayList源码 -> 正文阅读 |
|
[Java知识库]阅读ArrayList源码 |
0-?背景????????阅读了JAVA中ArrayList的源码,觉得挺有意思的部分,分享给大家。 ????????JDK版本:1.8.0 1-?扩容的实现方法????????ArrayList扩容的核心方法为:grow方法,该方法具有两个重载方法: (1)?有参方法
(2)无参方法
? ? ? ?当调用无参方法时,会默认的再次调用有参方法,所以扩容实质上是基于有参方法实现的 2- grow方法的功能解读(1)首先定义变量: 当前需要的长度为:minCapacity;? ? 当前的真实长度为:oldCapacity = elementData.length; 那么, 差值为:int differValue = minCapacity - oldCapacity; (2)为了减少扩容次数,则每次多扩容一点,可以选择扩原来长度的1.5倍,或者差值,那么为了尽可能减少扩容次数,则需要取它们的最大值,也就是源码中的newLength方法功能: 扩容之后的长度为: int newCapacity = oldCapacity + Max.max(differValue, oldCapacity*0.5); 当然,位运算更快,故写为: int newCapacity = oldCapacity + Max.max(differValue, oldCapacity>>1); ????????值得一提的是,之前的版本(JDK1.7)为: int newCapacity = oldCapacity + oldCapacity>>1; (3)如果原长度为小于等于0,或者原数组元素为空,或者则返回一个object[],长度为默认长度和所需长度的最大值(应该是为了应对直接调用grow方法)。 3- grow和newLength源码的完整源码
ps:ArrayList其它方法都比较简单,认真的看一看源码就懂了。有时间的话,再为大家详细解读一下。? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 11:33:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |