arraylist源码
Posted 三号小玩家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arraylist源码相关的知识,希望对你有一定的参考价值。
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
private static final int DEFAULT_CAPACITY = 10;
默认初始化空数组,Object数组,默认初始化数组大小,是10。
我们使用arraylist不会使用默认构造函数,一般都会给一个比较靠谱的数据,100或者1000个大小,避免让他不断扩容的操作。
add(E e)方法
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
每增加一个 size就会++;
elementData=["张三","李四","王五"];
size=2;
set方法
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
elementData[x]=ele;
index,不能大于等于size rangeCheck
(E) elementData[index]; 读数组里的元素
set(1,"赵六");
判断 长度是否大于size,
将index=1的数据读出来。
给index位置的数据赋值给,传入的值。
将之前读出来的value返回。
add(int index, E element) 方法
add(int index, E element)
index,不能大于等于size rangeCheck
size+1,确保数据不能满了。
数组拷贝的api
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
add(1,"麻子");
elementData=["张三","李四","王五"];
index=1;
size=3;
System.arraycopy(elementData, 1, elementData,2,
2);
elementData这个数组,从第一位开始(第二个元素)到数组(原来的)从第二位开始(第三个元素),到原来的向后挪一位。
public E get(int index) {
rangeCheck(index);//检查
return elementData(index);//直接拿数据
}
remove(int index)
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
检查,获取当前index的value,然后获取numMoved 也就是删除这个index后面需要向前挪数据的个数,
然后就复制。
将最后那位的数据给null。
add和addall这两个方法,数组需要扩容,数组长度固定,初始大小是10,需要扩容影响性能。
set,get定位到随机位置,性能很高。
以上是关于arraylist源码的主要内容,如果未能解决你的问题,请参考以下文章
获取 Intent 片段上的 Serializable ArrayList