前言
ArrayList也叫数组列表,底层使用的是数组实现的,严格来说是动态数组。
一般情况下,一个问题的认识都是由具体到抽象,先看一个入门案例:
|
|
测试结果:3 hello world lol 2
这个例子也很好理解,大概流程是先创建集合,在依次加入数据,依次取出和大小,在删除其中一个,在看大小和删除的数据是否存在,好了,入门程序就到这了,运用这几个方法我们可以把它复杂化运用到我们以后想要的上面。
至此下面将开始简单介绍一下add,get,remove方法的源码分析。
(当然我们也可以通过设置断点追踪源码)
add方法
在此之前,先介绍一下源码中的几个静态常量
|
|
下面就是add方法
|
|
首先进入第一个方法分析:
|
|
至此算是把add方法的底层分析了一遍,我们现在是不是可以假象一个简单例子来模拟流程
|
|
大概执行流程,数组为空,分配一个默认大小为10的容量,容量动态扩充,然后size变化,最后将值赋给数组,说了这么多,还是有点,总之,可以自己模拟数据,然后进行断点调试,就大概了解其过程了。
get方法
在此之前先补充一下arraylist的构造函数,如下
|
|
下面就来看一看get方法的执行过程
|
|
可以看到它的执行过程就这两步
remove方法
这里先说明一下,由于删除操作会改变size,所以每次删除都需要把元素向前移动一个位置,然后把最后一个位置设置为null,一次删除操作完成
|
|
很遗憾:断点调试中没有源码,因为其是native,是其他语言编写的,这里只做简单介绍
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于 length 参数。源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。
最后不得不提的是因为arraylist是动态增长的,即容量增产幅度遵循size/2+1,即默认为10,所以依次为:10,16,25.。。。。
这就造成arraylist是线程不安全的,多线程中产生问题,参考单例模式