最近看了太子的博客,记录下学习心得((#.#))
##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
基本上参考自三太子-敖丙的博客,谢谢大家看到最后。