需求
自定义的MyArrayList
java
import java.util.Arrays;
import java.util.Objects;
public class MyArrayList<E> {
private Object[] elementData ; // 存储元素的数组
private int size; // 记录 的元素个数
private static final int DEFAULT_CAPACITY = 10; // 默认容量
// 添加元素
public boolean add(E e) {
// 1.判断是否需要扩容
if (Objects.isNull(elementData) || size == elementData.length ) {
grow();
}
// 2.添加元素
elementData[size++] = e;
return true;
}
// 获取元素
public E get(int index) {
// 判断index是否合法
checkIndex(index);
return (E) elementData[index];
}
// 删除元素
public E remove(int index) {
// 1.判断index是否合法
checkIndex(index);
// 2.获取要删除的元素
E oldValue = (E) elementData[index];
// 3.计算要移动的元素个数
int moveSize = size - index - 1;
// 4.移动元素
if (moveSize > 0) {
// 从index+1开始移动 moveSize个元素到index位置
System.arraycopy(elementData,index + 1,elementData,index,moveSize);
}
// 5.将最后一个元素置为null
elementData[--size] = null;
return oldValue;
}
// 遍历
public void forEach(MyConsumer<E> action) {
Objects.requireNonNull(action);
for (int i = 0; i < size; i++) {
action.accept((E) elementData[i]);
}
}
// 扩容
private void grow() {
// 1.判断原来的容量是不是为0 如果为0 则新建一个长度为10的数组
if (size == 0){
elementData = new Object[DEFAULT_CAPACITY];
} else {
// 1.5倍扩容复制原来的数组到新数组
elementData = Arrays.copyOf(elementData,size + (size >> 1));
}
}
// 判断index是否合法
private void checkIndex(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("索引不合法");
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(elementData[i]);
if (i < size - 1) {
sb.append(",");
}
}
sb.append("]");
sb.append("size = ").append(size);
sb.append(" capacity = ").append(elementData.length);
return sb.toString();
}
}
自定义函数式接口(供forEach使用)
java
@FunctionalInterface
public interface MyConsumer<E> {
void accept(E e);
}
测试
java
// 测试添加元素
MyArrayList<String> list = new MyArrayList<>();
list.add("张无忌");
list.add("赵敏");
list.add("周芷若");
list.add("小昭");
list.add("殷素素");
list.add("张三丰");
list.add("张翠山");
list.add("张无忌");
list.add("赵敏");
list.add("周芷若");
list.add("小昭");
System.out.println("list = " + list);
// 测试获取元素
list.remove(0);
list.remove(99);
System.out.println("list = " + list);
// 测试遍历
list.forEach(System.out::println);