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个大小,避免让他不断扩容的操作。
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
?
?
?
每增加一个 size就会++;
elementData=["张三","李四","王五"];
size=2;
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)
?
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);//直接拿数据
}
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定位到随机位置,性能很高。
原文:https://www.cnblogs.com/q1359720840/p/14839466.html