61、数据结构
ArrayList底层是用数组结构来保存数据的,所以它是一个有序结构(和插入位置有关)。它可以添加null元素。有初始容量,默认为10,当添加元素超过容量后,会进行容量扩充,新容量为oldCapacity + (oldCapacity >> 1)也就是旧容量+旧容量的2分之1。
2、线程安全
ArryList是线程不安全的,如果需要多线程访问需要用户自己实现同步(synchronized)或用其他数据结构代替。
3、常用方法
~、get()
// 获取index位置的元素
public E get(int index){
// 下标检查,保证index < size
rangeCheck(index);
return elementData(index);
}
E elementData(index){
//可以看出是数组
return (E) elementData[index];
}
~、add()
// 在数组最后添加
public boolean add(E e){
// 进行容量检查,如果需要还要扩容
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
// 在指定位置添加
public void add(int index, E e){
rangeCkeckForAdd(index);
ensureCapacityInternal(size + 1);
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = e;
size++;
}
addAll(Collection<? extends E> c)
addAll(int index, Collection<? extends E> c)
2个方法同add2个方法原理一样。
~、 remove()
// 删除指定位置的元素
public E remove(int index){
rangeCheck();
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if(numMoved > 0)
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
// 消除引用
elementData[--size] = null;
return oldValue;
}
// 删除第一次出现的与参数o相等的元素
public boolean remove(Object o){
if(o == null){
for(int index = 0; index < size; index++){
if(elementData[index] == null){
fastRemove(index);
return true;
}
}
}else{
for(int index = 0; index < size; index++){
if(o.equals(elementData[index])){
fastRemove(index);
return true;
}
}
return false;
}
~、set()
// 替换index位置的的元素为element
public E set(int index, E element) {
// 下标检查,保证index < size
rangeCheck();
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
~、clear()
// 清空
public void clear(){
modCoumt++;
for(int i = 0; i < size; i++){
elementData[i] = null;
}
size = 0;
}
网友评论