源码类

package day03;

import java.util.Arrays;

/**
* @Author yqq
* @Date 2022/05/05 19:50
* @Version 1.0
*/
public class ArrayList {
/**
* 定义一个数组,用于保存数组中的集合
*/
private Object[] elementData;
/**
* 定义一个变量。用于保存数组中的元素的个数
*/
private int size;

/**
* 获取数组中实际存放的元素个数
* @return
*/
public int size(){
return this.size;
}

/**
* 无参构造方法(默认设置elementData数组的空间长度为10)
*/
public ArrayList(){
this.elementData = new Object[10];
}

/**
* 有参构造方法(指定设置elementData数组的空间长度)
* @param cap
*/
public ArrayList(int cap){
//判断cap变量是否合法
if (cap < 0)
throw new RuntimeException("参数不合法,cap:" + cap);
//实例化elementData数组
this.elementData = new Object[cap];
}

/**
* 添加元素
* @param element
*/
public void add(Object element){
//判断数组是否需要扩容
increaceCapacity();
elementData[size] = element;
//更新size的值
size ++;
}

/**
* 根据索引获取元素
* @param index
* @return
*/
public Object get(int index){
//判断索引是否合法
rangeCheck(index);
//根据索引获取对应的元素值
return elementData[index];
}

/**
* 检查索引是否合法
* @param index
*/
private void rangeCheck(int index){
if (index < 0 || index >= size)
throw new ArrayIndexOutOfBoundsException("索引越界,index:" + index);
}

/**
* 判断数组是否需要扩容
*/
private void increaceCapacity(){
if (elementData.length == size){
//创建一个比原数组空间长度更大的新数组
Object[] newArr = new Object[elementData.length * 2 + 1];
//把原数组中的元素拷贝进新数组中
for (int i = 0; i < elementData.length; i++) {
newArr[i] = elementData[i];
}
//让原数组保存新数组的地址值
elementData = newArr;
}
}
/**
* 根据索引删除元素
* @param index
*/
public void remove(int index){
//判断索引是否合法
rangeCheck(index);
//把删除索引之后的元素往前挪一位
//先获取删除索引及其之后的所有索引值
for (int i = 0; i < size - 1; i++) {
//把后一个元素往前挪动一位
elementData[i] = elementData[i + 1];
}
//把最后一个实际添加的元素设置为默认值
elementData[size - 1] = null;
//更新size
size --;
}

/**
* 在指定位置插入元素
* @param index
* @param element
*/
public void add(int index,Object element){
//判断索引是否合法
if (index < 0 || index > size)
throw new ArrayIndexOutOfBoundsException("索引异常,index:" + index);
//判断数组是否需要扩容
increaceCapacity();
//插入索引及其之后的元素往后挪动一位
//获得插入索引及其之后的所有索引值
for (int i = size - 1; i >= index ; i --) {
//把前一个元素往后挪动一位
elementData[i + 1] = elementData[i];
}
//在插入索引位置实现赋值操作
elementData[index] = element;
//更新size的值
size ++;
}

@Override
public String toString() {
return "ArrayList{" +
"elementData=" + Arrays.toString(elementData) +
'}';
}
}

测试类

package day03;

/**
* @Author yqq
* @Date 2022/05/05 20:04
* @Version 1.0
*/
public class Test02 {
public static void main(String[] args) {
ArrayList list = new ArrayList(3);
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
//根据索引删除元素
// list.remove(0);
//根据索引插入元素
list.add(0,"00");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// System.out.println(list.get(10));
}
}