61、數(shù)據(jù)結(jié)構(gòu)
ArrayList底層是用數(shù)組結(jié)構(gòu)來(lái)保存數(shù)據(jù)的,所以它是一個(gè)有序結(jié)構(gòu)(和插入位置有關(guān))。它可以添加null元素。有初始容量,默認(rèn)為10,當(dāng)添加元素超過(guò)容量后,會(huì)進(jìn)行容量擴(kuò)充,新容量為oldCapacity + (oldCapacity? >> 1)也就是舊容量+舊容量的2分之1。
2、線(xiàn)程安全
ArryList是線(xiàn)程不安全的,如果需要多線(xiàn)程訪問(wèn)需要用戶(hù)自己實(shí)現(xiàn)同步(synchronized)或用其他數(shù)據(jù)結(jié)構(gòu)代替。
3、常用方法
~、get()
// 獲取index位置的元素
public E get(int index){
? ? // 下標(biāo)檢查,保證index < size
? ? rangeCheck(index);
? ? return elementData(index);
}
E elementData(index){
? ? //可以看出是數(shù)組
? ? return (E) elementData[index];
}
~、add()
//? 在數(shù)組最后添加
public boolean add(E e){
? ? // 進(jìn)行容量檢查,如果需要還要擴(kuò)容
? ? 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個(gè)方法同add2個(gè)方法原理一樣。
~、 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;
}
// 刪除第一次出現(xiàn)的與參數(shù)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) {
? ? // 下標(biāo)檢查,保證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;
}