ArrayList的底层是长度可动态变化的数组,其适用于查找多,修改少的情况,原因是数组的元素的增加删除元素会涉及大量元素的移动,效率比较低。
首先创建一个类,创建一个数组和size属性。
private Object[] elementData; private int size; public MyArrayLIst(){ this(5); } //初始化 public MyArrayLIst(int size) { this.elementData = new Object[size]; this.size = 0; }
获取ArrayList的元素个数:
/** * 获取元素个数 */ public int size() { return size; }
添加元素:涉及到当前的数组是否满需要扩容的情况,即满则扩容
/** * 添加元素 */ public boolean add(T value) { //满则扩容 if (size == elementData.length) { elementData = Arrays.copyOf(elementData, elementData.length * 2); } elementData[size] = value; size++; return true; }
通过下标获取某个元素:应该判断其参数的合法性
/** * 获取元素 */ public T get(int index) { T data = (T) new Object(); if (index >= size || index < 0) { throw new RuntimeException("参数不合法"); } else { data = (T) elementData[index]; } return data; }
删除元素:删除元素涉及到元素的移动,便需要将删除元素的后面所有元素向前移动
/** * 删除元素 */ public boolean remove(int index) { if (index >= size || index < 0) { throw new RuntimeException("参数不合法"); } else { for (int i = index; i < size; i++) { //元素的移动 elementData[i] = elementData[i + 1]; } elementData[size - 1] = null;//便于GC的回收 size--; } return true; }
要实现Iterator的接口,便需要自定义的ArrayList实现Iterable接口 ,重写他的Iterator接口,并且重写其下的方法,其中包含三个主要的方法
boolean hasNext()
判断 iterator 内是否存在下1个元素,如果存在,返回true,否则返回false。
T next()
返回 iterator 内下1个元素,同时上面的指针向后移动一位。
故,如果不断地循环执行next()方法,就可以遍历容器内所有的元素了。
void remove()
删除 iterator 内指针的前1个元素,前提是至少执行过1次next();
(这个方法不建议使用,建议使用容器本身的romove 方法)。
@Override public Iterator<T> iterator() { return new str(); }
由于其返回的是一个对象,便需要创建一个内部类,来实现其中的方法,代码如下:
class str implements Iterator<T>{ int i; public str(){ i = 0; } @Override public boolean hasNext() { if(i < size()){ return true; } return false; } @Override public T next() { if(false){ } return (T)elementData[i++]; } }
具体的完整代码如下:import java.util.Arrays;import java.util.Iterator;
public class MyArrayLIst<T> implements Iterable<T>{ private Object[] elementData; private int size; public MyArrayLIst(){ this(5); } //初始化 public MyArrayLIst(int size) { this.elementData = new Object[size]; this.size = 0; } /** * 添加元素 */ public boolean add(T value) { //满则扩容 if (size == elementData.length) { elementData = Arrays.copyOf(elementData, elementData.length * 2); } elementData[size] = value; size++; return true; } /** * 获取元素 */ public T get(int index) { T data = (T) new Object(); if (index >= size || index < 0) { throw new RuntimeException("参数不合法"); } else { data = (T) elementData[index]; } return data; } /** * 获取元素个数 */ public int size() { return size; } /** * 删除元素 */ public boolean remove(int index) { if (index >= size || index < 0) { throw new RuntimeException("参数不合法"); } else { for (int i = index; i < size; i++) { //元素的移动 elementData[i] = elementData[i + 1]; } elementData[size - 1] = null;//便于GC的回收 size--; } return true; } @Override public Iterator<T> iterator() { return new str(); } class str implements Iterator<T>{ int i; public str(){ i = 0; } @Override public boolean hasNext() { //if(i < size()){ //return true; //} //return false;
return i < size; //emmmm上面的写法觉得有点蠢
} @Override public T next() { if(false){ } return (T)elementData[i++]; } @Override public void remove() { } } public static void main(String[] args) { MyArrayLIst<Integer> myArrayLIst = new MyArrayLIst<>(); myArrayLIst.add(9); myArrayLIst.add(8); myArrayLIst.add(1); myArrayLIst.add(2); myArrayLIst.add(3); myArrayLIst.add(5); System.out.println(myArrayLIst.size()); System.out.println(myArrayLIst.get(4)); // myArrayLIst.remove(1); // System.out.println(myArrayLIst.get(1)); Iterator iterator = myArrayLIst.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + " "); } } }
测试如图:

自定义实现的ArrayList以及自定义实现的Iterator迭代器
原文:https://www.cnblogs.com/128-cdy/p/12029302.html