ArrayList 继承至父类 AbstractList实现接口 List,RandomAccess,Cloneable克隆接口,Serializable可序列化接口java
注意到如下三个主要变量 两个静态变量(存在于JVM的Method Area 方法区)一个Object得数组类型数组
其中EMPTY_ELEMENTDATA 是new ArrayList()时初始化得一个空对象数组数据结构
初始化长度为DEFAULT_CAPACITY得值dom
来看arrayList的几个主要方法ui
添加方法主要调用ensureCapacityInternal方法 这个方法 以下 主要是作长度判断的 若是加入的对象使得arrayList得长度 超过默认得10以后 会作grow操做 就是增加操做.net
增加操做则是在原有得长度 len/2+len 将原有得数组复制到新的数组里面 并赋值回去 旧的数组 在通过一次GC以后消亡。下面来看get操做对象
检查index值是否在长度以内 若是不是抛出indexoutofBoundsException 数组越界异常blog
若是在 这直接经过数组下标获取对象值 返回。继承
-----------------------------------------------------------------------这里是分割线接口
鉴于工做中碰到remove的操做 刚好看了看这块 仍是准备把心得写下来 已作不时之需
一下主要探讨 remove(Object) 和removeAll(Collections)
1.能够看到remove 中主要作的操做是更具下标遍历数组 而后调用Object.equals方法 这个方法源码以下
比较的是两个对象的地址。这个涉及到 java虚拟机中对象的存储结构 当两个对象数据彻底同样的时候 java虚拟机不会从新建立一个对象 而是将两个变量指向同一块内存区
如 String a="123" ,String b=new String("123"),a和b引用的是同一块地址
2.找到相同的对象以后,拿到他的下标index 调用fastRemove方法 遍历index+1以后的元素 将其所有前挪一位 并将最后一个元素置为Null
在通过一次Minor GC以后 这个地方的内存将会被释放
removeAll(Collection)
源码中使用三行代码就完成 将全部不存在与参数列表C的元素从数组 elementDate 0开始从新赋值 组装成新的数组 这里complement为false
而后以w为开始 遍历 并将元素赋值为null 注意 第一个IF 是用来处理contains异常使用的 当抛出异常的时候 r是不等与size的 会走第一个if 若是不抛出异常 会直接走第二个IF
总结:以上能够看书 ArrayList集合 是基于数组实现的一个数据结构 数组元素为Object
增加机制为 新建一个为原来1.5倍长的数组 将元素复制过去便可
附上JVM虚拟机内存结构模型文档
https://blog.csdn.net/luomingkui1109/article/details/72820232