| |
|
开发:
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扩容机制分析 |
????????JDK8中,ArayList的底层是一个数组,类型是Object类型。同时没有synchronized之类的关键字,说明它是线程不安全的。 常量?
构造器带int参数
不带参数
没有传参或参数为0的构造方法中,什么时候才会真正的创建数组呢?在第一次调用add方法的时候。 部分方法重点的方法就是add方法。其他的方法我们看看源码就可以了。 add方法????????add方法支持两种:第一种直接add,第二种是像数组那样在index下标add。add方法中,首先通过ensureCapacityInternal方法确定是不是要扩容。然后当前的size下标插入元素e后,让size(插入的元素个数+1)。那ensureCapacityInternal方法中发生了什么? ensureCapacityInternal方法 ? ? ? ? 假设没有传入参数或参数为0,刚分析源码得知没有创建数组,进入该方法。size表示数组的下标,在+1就是数组的大小,传入size+1是合理的。 进入该方法后,先calculateCapacity数组,在ensureExplicitCapacity刚刚的结果。 calculateCapacity方法 在该方法中,计算要初始化的大小。如果数组是个没有传参的数组,返回默认数组大小10和刚传进来的size + 1;否则返回构造的时候定义的数组大小。总体来说,这个方法用来计算数组的容量。 ensureExplicitCapacity方法 ensureExplicitCapacity方法拿到calculateCapacity方法的容量后,进行判断。如果判断的容量比数组的原来容量大,就扩容,进入grow方法。 grow方法 ????????进入该方法后,先将数组的大小定义为旧的容量,新的容量就是旧的容量的1.5倍。然后进行判断。minCapacity是根据当前有多少个元素来计算的,newCapacity是直接根据数组大小来计算的。 ????????如果新的容量比计算的容量小,新的容量就是计算的容量;如果新的容量超过MAX_ARRAY_SIZE(一个很大的数),就进入hugeCapacity方法。否则,直接创建一个newCapacity大小的数组,拷贝到当前的elementData数组中。 综上,我们就可以得知,在jdk8中使用ArrayList,并不是立即就创建数组,而是第一次调用add方法后才创建。 set方法remove方法总结优点: (1)根据下标遍历元素和访问元素效率较高。 (2)插入和删除元素的效率不高。 (3)根据元素的值查找元素的下标需要遍历整个元素数组,效率不高。 (4)线程不安全。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/25 19:43:28- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |