ArrayList实现了一个可变长度数组,ArrayList这个对象包含一个数组,以及当前数组添加的元素个数,以及添加元素个数和数组长度一样的时候将原数组复制到新数组。代码如下。
package test;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* 实现自己的ArrayList
*
* @author lenovo
*
* @param <T>
*/
public class MyArrayList<T> implements Iterable<T> {
private static final int DEFAULT_CAPACITY = 16;// 初始化数组长度
private static int arraySize;// 数组放入元素的个数
private T[] items;// 内部数组存放添加对象
public MyArrayList() {// 默认构造器
arraySize = 0;
items = (T[]) new Object[DEFAULT_CAPACITY];
}
public T get(int index) {// 根据下标获取元素
if (index < 0 || index > arraySize) {
throw new ArrayIndexOutOfBoundsException();
}
return items[index];
}
public void set(int index, T t) {// 将下标index数组的元素设置为t
if (index < 0 || index >= arraySize) {
throw new ArrayIndexOutOfBoundsException();
}
items[index] = t;
}
public int size() {// 数组实际长度
return arraySize;
}
public void add(T t) {// 想list添加元素t
add(arraySize, t);
}
public boolean isEmpty() {// 判断list是否为空
return arraySize == 0;
}
public void clear() {// 清空list元素
arraySize = 0;
enrich(DEFAULT_CAPACITY);
}
public void add(int index, T t) {// 向下标index添加元素,index后面的元素依次后移
if (arraySize == items.length) {
enrich(arraySize * 2 + 1);
}
for (int i = arraySize; i > index; i--) {
items[i] = items[i - 1];
}
items[index] = t;
arraySize++;
}
public void enrich(int newSize) {// 扩容数组
System.out.println("扩容");
if (newSize < arraySize) {
return;
}
T[] old = items;
items = (T[]) new Object[newSize];
for (int i = 0; i < arraySize; i++) {
items[i] = old[i];
}
}
@Override
public Iterator<T> iterator() {//遍历List
return new IteratorArray();
}
private class IteratorArray implements Iterator<T> {
private int current = 0;
@Override
public boolean hasNext() {
return current < size();
}
@Override
public T next() {
if(!hasNext()) {
throw new NoSuchElementException();
}
return items[current++];
}
}
}