浅聊ArrayList

Posted admiraldeworm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅聊ArrayList相关的知识,希望对你有一定的参考价值。

1.底层结构是什么?
结构是Object[ ]的数组
来扒一扒源码:Tips:看源码,主要看核心参数、核心构造方法、核心方法

1.1核心参数:

 1.2核心构造方法:

 看它的无参构造可知给存储数据的数组elementDate设置了一个空数组(初始容量是0)

1.3看添加的方法:

 先进ensureCapacityInternal()方法最后再存值:

elementDate[size++] = e;//它数组的下标位置是一个一个往后加的所以arrayList数组是有序的;它没有对值做任何判断所以是可重复的

1.4进入ensureCapacityInternal:

 在容量超过了数组长度的时候执行扩容方法grow():

1.5进入grow:

 0+0*二分之一就是扩容的大小

2、初始容量是多少?
JDK1.8之后包含1.8,初始容量是0;在第一次执行add方法时就会存在初始值 初始容量为10

new 一个arraylist它的数组长度是0

**小tips:**JDK1.6之前包含1.6,初始容量是10
3、何时扩容?
第一次扩容就是在第一次执行add的时候,初始容量为10

第二次扩容:在存储第11个值的时候扩容,扩容大小为1.5倍 15

第三次扩容:在存储第16个值的时候扩容,22(int类型的取整)

**小tips:**JDK1.5的时候arrayList扩容是1.5倍+1

4、为什么查询快,增删改慢?
查询快:这和它的结构有关系,数组是一个连续的存储空间,因为是连续的所以查询的时候通过下标去找,只需找一次就行

增删改慢:在删除一个数时,需要把后面的元素全部前移,同理在增加一个数时,需要把它后面的元素全部后移,所以速度慢

但是这不是绝对的,在按正常顺序的增加时和删除最后一个元素时,速度也很快

小结:顺序新增速度很快,随机插入效率很低
5、一个小面试题

解决方法: 

 

6、一个没有营养的问题:
为什么初始长度大小是10?

官方回答:因为1太小,100太大,所以取了个10;翻译一下就是:没有为什么,就是“感觉”10挺好的,不大不小,刚刚好,眼缘!

以上是关于浅聊ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot入门教程:浅聊POJO简单对象(VODTOEntity)

SpringBoot入门教程:浅聊POJO简单对象(VODTOEntity)

ArrayList和LinkedList

浅聊JavaScript中的this

ArrayList源码解析

ACM浅聊