接下来我们来自定义一个ArrayList
package com.example.suanfademo;
public class MyArrayList<E> {
//定义数组,用于存储集合的元素
private Object[] elementData;
//定义变量,用于记录数组的大小
private int size;
//定义空数组,用于在创建集合对象的时候给elementData初始化
private Object[] emptyArray = {};
//定义常量,用于记录集合的容量
private final int DEFAULT_CAPACITY = 10;
public MyArrayList() {
//给elementData初始化
elementData = emptyArray;
}
/**
* 添加
*/
public boolean add(E e) {
//校验是否需要扩容
ensureCapacityInternal();
//将元素添加到集合
elementData[size++] = e;
return true;
}
/**
* 修改
*/
public E set(int index, E element) {
if (index >= size)
throw new IndexOutOfBoundsException("索引越界了!");
//把index对应的元素取出,将来好返回
E oldValue = (E) elementData[index];
//替换元素
elementData[index] = element;
return oldValue;
}
/**
* 删除方法
* 需要移动元素
*/
public E remove(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("索引越界了!");
//取出元素,将来好返回
E oldValue = (E) elementData[index];
//计算出要移动元素的个数
int numMoved = size - index - 1;
//判断移动元素的个数是否大于0
//如果我们要移动的元素是1,那么我们需要移动1后面的元素,
if (numMoved > 0)
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
//最后的元素是无效的
elementData[--size] = null;
return oldValue;
}
/**
* 获取元素
*/
public E get(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("索引越界了!");
return (E) elementData[index];
}
public String toString() {
//对集合进行判断,如果没有元素就返回“[]”
if (size == 0) {
return "[]";
}
//创建StringBuilder
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size; i++) {
if (i == size - 1) {
sb.append(elementData[i]).append("]");
} else {
sb.append(elementData[i]).append(",").append(" ");
}
}
return sb.toString();
}
/**
* 扩容
*/
private void ensureCapacityInternal() {
//集合存储元素的数组是否是空数组
if (elementData == emptyArray ) {
//如果是空数组,第一次扩容
elementData = new Object[DEFAULT_CAPACITY];
}
//核心算法
//size的长度是5,那么集合元素数组的长度是10,那么size == 集合元素数组的长度就扩容
if (size == elementData.length) {
//先定义变量记录老容量
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
Object[] obj = new Object[newCapacity];
//拷贝元素到新数组当中
System.arraycopy(elementData, 0, obj, 0, elementData.length);
//把新数组的地址赋值给elementData
elementData = obj;
}
}
}