public class MyArrayList<E> implements Iterable<E> { //迭代器接口
//数组存储值
private Object[] elementData;//大小
private int size;
public MyArrayList(int initialCapacity) {
if (initialCapacity >= 0) {
elementData = new Object[initialCapacity];
} else {
try {
throw new MyException();
} catch (MyException e) {
e.printInit();
}
}
}
public MyArrayList() {
this(0);
}
@SuppressWarnings("unchecked")
private E elementData(int index) {
return (E) elementData[index];
}
private void ensureCapacity() {
if (size >= elementData.length) {
elementData = Arrays.copyOf(elementData, size * 2 + 1);
}
}
private void rangeCheck(int index) {
if (index < 0 || index >= size) {
try {
throw new MyException();
} catch (MyException e) {
e.printIndex();
}
}
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
for (int i = 0; i < size; ++i) {
if (elementData[i].equals(o))
return i;
}
return -1;
}
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
public void add(E element) {
ensureCapacity();
elementData[size++] = element;
}
public void add(int index, E element) {
rangeCheck(index);
ensureCapacity();
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
++size;
}
public E remove(int index) {
rangeCheck(index);
E oldValue = elementData(index);
System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
elementData[--size] = null;
return oldValue;
}
public boolean remove(E element) {
for (int i = 0; i < size; ++i) {
if (elementData[i].equals(element)) {
remove(i);
return true;
}
}
return false;
}
//实现Iterable<E>接口的方法
@Override
public Iterator<E> iterator() {
return new MyIter();
}
//内部类
private class MyIter implements Iterator<E> {
//计数器-->指针 游标
private int cursor;
private int lastRet = -1;
//判断是否存在下一个
@Override
public boolean hasNext() {
return cursor != size;
}
//返回游标当前位置,并把游标移到下一位置
@SuppressWarnings("unchecked")
@Override
public E next() {
if (!hasNext()) {
try {
throw new MyException(8000,"系统内部错误");
} catch (MyException e) {
e.printnext();
}
}
lastRet = cursor;
return (E) elementData[cursor++];
}
}
public static void main(String[] args) {
MyArrayList<String> list = new MyArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add(2, "123");
list.remove("3445987");
//使用迭代器遍历
for (Iterator<String> itr = list.iterator(); itr.hasNext(); ) {
System.out.println(itr.next());
//itr.remove();
}
System.out.println("---------------------");
//使用增强for循环遍历
for (String str : list) {
System.out.println(str);
}
}
}
class MyException extends Exception {
private static final long serialVersionUID = 1L;
private int errorCode;
public MyException(int errorCode,String message) {
super(message);
this.errorCode = errorCode;
}
public MyException() {
System.out.print("出现异常:");
}
public void printIndex() {
System.out.println("索引范围越界!");
System.exit(1);
}
public void printInit() {
System.out.println("请重新初始化");
}
public void printnext() {
System.out.println("游标越界!");
System.exit(1);
}
public void printremove() {
System.out.println("remove()只有在执行完next()后才能且只能执行一次!");
System.exit(1);
}
}
手写ArrayList
最新推荐文章于 2022-10-25 15:35:17 发布