版权声明: https://blog.csdn.net/li_xunhuan/article/details/89153496
/**
* 自己实现一个ArrayList,帮助自己更好地理解ArrayLIst类的底层结构
*/
public class MyArrayList /*implements List*/ {
private Object[] elementData;
private int size;
public int getSize() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public MyArrayList() {
this(10);
}
public MyArrayList(int initialCapacity) {
try {
if (initialCapacity < 0) {
throw new Exception();
}
} catch (Exception e) {
e.printStackTrace();
}
elementData = new Object[initialCapacity];
}
public void add(Object obj) {
//实现数组扩容
ensureCapacity();
elementData[size++] = obj;
/*size++;*/
}
public Object get(int index) {
rangeCheck(index);
return elementData[index];
}
public void remove(int index) {
//删除指定位置的对象
rangeCheck(index);
int numMoved = size - index - 1;
System.arraycopy(elementData, index + 1, elementData, index,
numMoved);
elementData[--size] = null;
}
public void remove(Object obj) {
for (int i = 0; i < size; i++) {
if (get(i).equals(obj)) {
remove(i);
}
}
}
public Object set(int index, Object obj) {
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = obj;
return oldValue;
}
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 rangeCheck(int index) {
if (index < 0 || index >= size) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void ensureCapacity() {
if (size == elementData.length) {
Object[] newArray = new Object[size * 2 + 1];
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
}
}
public static void main(String[] args) {
MyArrayList list = new MyArrayList(3);
System.out.println(list.getSize());
if (list.isEmpty()) {
System.out.println("数组是空的");
}
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
System.out.println(list.getSize());
System.out.println(list.isEmpty());
System.out.println(list.get(3));
list.remove(3);
System.out.println(list.getSize());
}
}
知识要点: 一、实际上ArrayList类内部实现的时候还是以数组的形式存数据的;相较于数组,其类型在JDK原码中是用泛型E来定义的,我此处所写Object来描述的; 二、关乎一个动态数组的一些参数: 描述类型:Object 数组的默认大小:int initialCapacity 数组当前的大小(容纳大小):Capacity 数组的目前的大小(null不算): int size 三、对一个动态数组进行插入、移除、增加、定点设置这一系列操作我们都是要对所要执行的位数所判断其有没有越界,这么多操作如果都进行操作合法性的判断,那么最合理的方式是用封装解决这个问题,在类里面private描述一个rangeCheck方法,只供类内部的方法所调用; 四、还有一个关键问题是ArrayList类内部的数组大小不够用了怎么办? 这也是用一个封装来实现比较好----我们使数组只要增加一个元素,size++;数组减少一个元素,size–;在这个默认前提下,编写一个封装,只要以一发现数组size==elementData.length,那么就再新建一个数组newArray,并且使这个数组的大小设置为size*2+1;并调用System的数组复制功能System.arraycopy();实现原数组到新数组元素的全盘复制;最后再让原数组elementData=newArray,原数组名指向了新数组对象