当执行add方法添加第一个元素时,执行下面的代码
此处涉及到两条代码:
- ensureCapacityInternal方法内会调用calculateCapacity方法,此处才是赋予数组长度为10
ensureCapacityInternal 方法
calculateCapacity方法
private static int calculateCapacity(Object[] elementData, int minCapacity) {
//如果数组是空的
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
//返回数组的容量,DEFAULT_CAPACITY=10
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
此时集合可以添加默认的10个元素
2.添加第11个元素时
当添加第11个元素时,ensureExplicitCapacity方法中,minCapacity为11,而原数组长度为10,所以if结构进入grow方法-扩容核心方法
ensureExplicitCapacity方法
grow方法-扩容核心方法
private void grow(int minCapacity) {
// overflow-conscious code
//把旧的长度赋值给oldCapacity
int oldCapacity = elementData.length;
//新的长度就=旧的长度*1.5
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
//按照新的长度复制出一个新的数组
elementData = Arrays.copyOf(elementData, newCapacity);
}
- oldCapacity赋值为原数组长度,为10 ,newCapacity赋值为原长度1.5倍,即15
- 调用复制数组方法,将之前的数组复制到新的数组中,并将需要添加的元素加到数组最后一位,完成扩容!
如何复制某个ArrayList到另一个Arraylist中去?
重写clone方法,ArrayList克隆
厘清概念:深浅拷贝
Java进阶(4)——结合类加载JVM的过程理解创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化
浅拷贝:虽然返回一个元素一样的ArrayList,复制的是元素的引用,即其中一个改变了元素,另一个也会跟着改变
两个集合中间存储了同一份元素的引用
例如:
深拷贝:重写clone方法,利用迭代器iterator或遍历集合,重新创建引用对象,逐个添加
例如:
复制的方法
list.clone()
clone.addALl(list);
Collections.copy(clone,list);
在索引中ArrayList的增加或者删除某个对象的运行过程?效率很低吗?解释一下为什么?
效率确实低
效率是很低的,因为ArrayList无论是增加或者删除某个对象,我们都要通过对数组中的元素进行移位来实现。
- 增加元素时,我们要把要增加位置及以后的所有元素都往后移一位,先腾出一个空间,然后再进行添加。
- 删除某个元素时,我们也要把删除位置以后的元素全部元素往前挪一位,通过覆盖的方式来删除。
而这种移位就需要不断的arraycopy,是很耗时间的,所以效率自然也很低。
源码arraycopy方法
增加元素时
删除元素时
现在我有一个很大的数组需要拷贝,原数组大小是 5k,请问如何快速拷贝?
指定长度创建ArrayList对象,避免频繁扩容
如何获得一个线程安全的ArrayList集合?
Collections.synchronizedList
List datas = Collections.synchronizedList(new ArrayList<>());
源码分析
从源码可以看到集合操作都加了synchronized 关键字,保证了在同一时刻,数组和链表只会被一个线程所修改。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-QvTP7lF1-1712972377371)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!