ArrayList实现了长度可变的数组,在内存中分配连续的空间。
优点:遍历元素和随机访问元素的效率比较高
缺点:添加和删除需要大量移动元素效率低,按照内容查询效率低。
为深入了解学习ArrayList,自己仿写了部分方法。
public class MyArrayList {
private Object[] elementData;
private int size;
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public MyArrayList() {
this(10);
}
public MyArrayList(int initialCapacity) {
if (initialCapacity < 0) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
elementData = new Object[initialCapacity];
}
public void add(Object obj) {
ensureCapacity();
elementData[size++] = obj;
}
public void add(int index, Object obj) {
rangeCheck(index);
ensureCapacity();
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = obj;
size++;
}
private void ensureCapacity() {
// 数组扩容和数据的拷贝
if (size >= elementData.length) {
Object[] newArray = new Object[(size + 1) * 2];
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
}
}
public Object get(int index) {
rangeCheck(index);
return elementData[index];
}
public void remove(int index) {
rangeCheck(index);
// 删除指定位置的对象
int numMoved = size - index - 1;
if (numMoved > 0) {
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
}
elementData[--size] = null;
}
public void remove(Object obj) {
for (int i = 0; i < elementData.length; i++) {
if (get(i).equals(obj)) {
remove(i);
}
}
}
private void rangeCheck(int index) {
if (index < 0 || index >= size) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public Object set(int index, Object obj) {
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = obj;
return oldValue;
}
}