jdk API數(shù)組拷貝
Arrays.copyOf(objects, size);
System.arraycopy(src, srcPos, dest, destPos, length);
src:源數(shù)組
srcPos:原數(shù)組起始位置
dest:目標(biāo)數(shù)組
destPos:目標(biāo)數(shù)組起始位置
length:復(fù)制長(zhǎng)度
注意點(diǎn)
1.ArrayList底層采用該數(shù)組實(shí)現(xiàn),數(shù)組名稱為elementData
2.ArrayList默認(rèn)大小為10斤讥;
3.如果ArrayList構(gòu)造器中指定初始化大小為1;初次位移擴(kuò)容始終為1,新容量大小以最小容量為主
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
4.刪除原理:使用System.arraycopy方法,往前移動(dòng)數(shù)組,將最后一個(gè)元素設(shè)置為空
5.Arrays.asList返回的不是ArrayList减余,而是Arrays的私有靜態(tài)內(nèi)部類午笛,它與ArrayList區(qū)別是沒(méi)有實(shí)現(xiàn)Cloneable接口,其它一致鹦肿,它沒(méi)有實(shí)現(xiàn)添加方法,所以不能添加元素
Vector與ArrayList
1.vector線程安全辅柴,方法使用synchronize修飾箩溃,效率比ArrayList差
2.Vector和ArrayList都采用連續(xù)的存儲(chǔ)空間,當(dāng)存儲(chǔ)空間不足的時(shí)候碌嘀,vector默認(rèn)增加為原來(lái)的一倍涣旨,ArrayList默認(rèn)正價(jià)為原來(lái)的50%
3.Vector可以設(shè)置capacityIncrement(容量增長(zhǎng)參數(shù)),而ArrayList不可以設(shè)置
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
//vector 擴(kuò)容方式(注意:擴(kuò)容參數(shù))
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
手寫ArrayList代碼
public class ExtArrayList<E> implements ExtList<E>{
//ArrayList底層采用數(shù)組存放
private Object[] elementData;
//默認(rèn)數(shù)組容量
private static final int DEFAULT_CAPACITY = 10;
//記錄實(shí)際ArrayList大小
private int size;
//默認(rèn)初始化容量為10
public ExtArrayList() {
this(DEFAULT_CAPACITY);
}
//ArryList指定數(shù)組初始的容量
public ExtArrayList(int initialCapacity) {
if (initialCapacity < 0) {
throw new IllegalArgumentException("初始化容量不能小于0");
}
elementData = new Object[initialCapacity];
}
public void add(E e) {
//1.判斷實(shí)際存放的數(shù)據(jù)容量是否大于elementData
ensureCapacityInternal(size + 1);
//2.使用下標(biāo)進(jìn)行賦值
elementData[size++] = e;
}
public void add(int index, E e) {
rangeCheck(index);
ensureCapacityInternal(size + 1);
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = e;
size ++;
}
// int minCapacity 當(dāng)前 size + 1
private void ensureCapacityInternal(int minCapacity) {
if (size == elementData.length) {
// //新數(shù)組容量大小
// int newCapacity = 2 * size;
// Object[] newObjects = new Object[newCapacity];
//新舊數(shù)組復(fù)制
// for (int i = 0; i < elementData.length; i++) {
// newObjects[i] = elementData[i];
// }
// elementData = newObjects;
//新舊數(shù)組復(fù)制
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
//最小擴(kuò)容容量股冗;防止初始容量大小為1
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
//使用下標(biāo)獲取數(shù)組元素
public Object get(int index) {
return elementData[index];
}
@SuppressWarnings("unchecked")
E elementData(int index) {
return (E) elementData[index];
}
public Object remove(int index) {
rangeCheck(index);
//1.使用下標(biāo)查詢?cè)撝凳欠翊嬖? Object object = get(index);
//計(jì)算刪除元素后面的長(zhǎng)度
int numMoved = size - index - 1;
if (numMoved > 0) {
//2.刪除原理分析
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
}
//將最后一個(gè)元素變?yōu)榭? elementData[--size] = null;
return object;
}
// 刪除相同元素 刪除第一個(gè)
public boolean remove(E e) {
for (int i = 0; i < elementData.length; i++) {
Object value = elementData[i];
if (value.equals(e)) {
remove(i);
return true;
}
}
return false;
}
//判斷下標(biāo)是否越界
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("越界啦!");
}
public int getSize() {
return size;
}
}