JAVA中的ArrayList

本文详细探讨了ArrayList的基础概念、线程安全问题、初始化与扩容机制,对比了1.7和1.8版本变化,并剖析了增删操作效率。重点讲解了ArrayList在实际开发中的选择和潜在问题,以及与Vector的差异。
摘要由CSDN通过智能技术生成

最近看了太子的博客,记录下学习心得((#.#))
##1、什么是ArrayList?
顾名思义是一个数组列表,用来存储数据!!!底层使用数组实现存储的。
特点:查询效率高,但是增删改效率低哦,虽然线程不安全,但是使用效率和场景最高(个人开发过程中╭(╯^╰)╮)。

##2、ArrayList线程不安全为什么还要使用它?
其实我们开发过程中百分之80的工作场景是查询,就好像我们平时逛淘宝,大多时候都是看,买的频率并不是很高(好吧,博主没钱!!!)。

在这里插入图片描述
如果涉及到频繁的正删改的场景,可以使用LinkedList,如果要考虑到线程安全的问题就用Vector(博主没用过,2333),实际开发过程中,使用ArrayList还是最多的。
不存在一个集合工具查询效率又快,增删改效率也高,同时线程也安全的!鱼和熊掌不可兼得的道里一样,牺牲了性能,那就安全。牺牲了安全,那就快速和时间换空间的道里一样。

##3、ArrayList初始化
ArrayList可以在通过构造方法在集合初始化的时候指定底层数组的大小。底层是通过ArrayList()初始化:
在这里插入图片描述
在初始化的时候,赋值底层Object[initialCapactity] elementData为一个空的数组,只有当我们向list中add添加数据的时候,才会分配默认的EMPTY_ELEMENTDATA = 10的初始容量。
在这里插入图片描述
在这里插入图片描述
看源码可以看到:无参就是默认大小,数组大小为10,有参会判断参数。

##4、ArrayList的扩容
数组的长度是有限制的,但是ArrayList存储数据却不受限制的,ArrayList是如何实现的呢?
底层是数组的扩容:

在这里插入图片描述

##5、ArrayList在1.7和1.8的区别
在JDK1.76之后,ArrayList的变化有点大,第一是在初始化的时候,1.7以前会调用this(10)才是真正的容量为10,1.7之后,都是默认走了空数组,只有在ArrayList调用add方法添加数据的时候,容量才会变成10

##6、ArrayList增删的时候如何做的

在这里插入图片描述
jdk1.8之后采用的位运算,右移一位,其实就是除以2的操作,效率高了很多,
在这里插入图片描述
指定位置新增的时候,在校验之后的操作很简单,就是数组的copy,
在这里插入图片描述
在这里插入图片描述
我们只是在这个很小的list中操作,如果操作的一个几百万甚至上千万的list的时候,如果新增一个元素,那么就需要复制后面的所有的元素,如果再涉及到扩容,那就更新不就是更慢了嘛。所以说,ArrayList增删改效率慢。

##6、JAVA Bug里的一个问题
在这里插入图片描述
我在创建ArrayList对象的时候,设置大小为10,但是我打印他的长度却为0,并且在调用set方法指定下

标的值的时候,会报数组越界的错误!底层数组初始化了,但是list并没有初始化。

##7、ArrayList删除一定慢吗?
这个要取决于要删除的元素离数组末端的距离来决定的,push和pop操作完
全不涉及数据移动操作。只要不涉及到数据移动操作,删除不一定就是慢的。
在这里插入图片描述
同理他的效率也低,因为数组如果很大的话,那样需要复制和移动的位置就大了。

##8、ArrayList线程不安全,Vector为什安全?
因为Vector底层的方法全部加上了Synchronized同步代码,保证线程安全,效率肯定也不高!

参考资料:
https://github.com/JavaFamily
基本上参考自三太子-敖丙的博客,谢谢大家看到最后。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值