需求
自定义的MyArrayList
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) {
if (Objects.isNull(elementData) || size == elementData.length ) {
grow();
}
elementData[size++] = e;
return true;
}
public E get(int index) {
checkIndex(index);
return (E) elementData[index];
}
public E remove(int index) {
checkIndex(index);
E oldValue = (E) elementData[index];
int moveSize = size - index - 1;
if (moveSize > 0) {
System.arraycopy(elementData,index + 1,elementData,index,moveSize);
}
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() {
if (size == 0){
elementData = new Object[DEFAULT_CAPACITY];
} else {
elementData = Arrays.copyOf(elementData,size + (size >> 1));
}
}
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使用)
@FunctionalInterface
public interface MyConsumer<E> {
void accept(E e);
}
测试
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);