1.项目结构
2.定义接口
1 package list; 2 3 public interface MyList<E> { 4 public abstract void add(E object); 5 6 public abstract void add(int index, E object); 7 8 public abstract boolean remove(E object); 9 10 public abstract Object remove(int index); 11 12 public abstract int getSize(); 13 14 public abstract Object get(int index); 15 16 public abstract void set(int index, Object object); 17 }
- 3.定义实现类
1 package list; 2 3 import java.util.Arrays; 4 5 public class MyArrayList<E> implements MyList {
//定义数组 6 private transient Object[] elementData;
//元素个数 7 private int size; 8 //构造方法初始化数组容量 9 public MyArrayList() { 10 this(10); 11 } 12 13 public MyArrayList(int initialCapacity) { 14 if (initialCapacity < 0) { 15 throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); 16 } 17 elementData = new Object[initialCapacity]; 18 } 19 20 @Override 21 public void add(Object object) { 22 ensurExplicitVapacity(size + 1); 23 elementData[size++] = object; 24 } 25 26 //数组扩容 27 private void ensurExplicitVapacity(int minCapacity) { 28 if (minCapacity > elementData.length) { 29 int oldCapacity = elementData.length; 30 int newCapacity = oldCapacity + (oldCapacity >> 1); 31 elementData = Arrays.copyOf(elementData, newCapacity); 32 } 33 } 34 35 @Override 36 public void add(int index, Object object) { 37 rangeCheck(index); 38 ensurExplicitVapacity(size + 1); 39 System.arraycopy(elementData, index, elementData, index + 1, size); 40 elementData[index] = object; 41 size++; 42 } 43 44 //检测数组是否索引越界 45 private void rangeCheck(int index) { 46 if (index >= size || index < 0) { 47 throw new IndexOutOfBoundsException("lenth-->" + index); 48 } 49 } 50 51 @Override 52 public boolean remove(Object object) { 53 for (int i = 0; i < elementData.length; i++) { 54 Object element = elementData[i]; 55 if (element.equals(object)) { 56 remove(i); 57 return true; 58 } 59 } 60 return false; 61 62 } 63 64 @Override 65 public Object remove(int index) { 66 Object object = get(index); 67 int numMoved = elementData.length - index - 1; 68 if (numMoved > 0) { 69 System.arraycopy(elementData, index + 1, elementData, index, numMoved); 70 } 71 elementData[--size] = null; 72 return object; 73 } 74 75 @Override 76 public int getSize() { 77 return size; 78 } 79 80 @Override 81 public Object get(int index) { 82 rangeCheck(index); 83 return elementData[index]; 84 } 85 86 @Override 87 public void set(int index, Object object) { 88 rangeCheck(index); 89 remove(index); 90 E e = (E) object; 91 add(index, e); 92 } 93 }
4.定义测试类
package list; import java.util.ArrayList; public class Test { public static void main(String[] args) { MyArrayList<String> list = new MyArrayList<>(); for (int i = 0; i < 100; i++) { list.add(i + ""); } list.add(0, "按照索引添加元素"); list.add(0, "fff"); printList(list); //list.remove("fff"); //list.remove(0); list.set(0,"set"); printList(list); } //遍历打印 public static void printList(MyArrayList<String> list) { System.out.print("["); for (int i = 0; i < list.getSize(); i++) { if (i != list.getSize()) { System.out.print(list.get(i) + ", "); } else { System.out.print(list.get(i) + "]"); } } } }
5.总结
Arraylist源码难点 : 数组是如何扩容的
这里只是写了一些Arraylist的简单逻辑, 还有很多细节没有去实现,编写这段代码只是为了更好的理解ArrayList的实现原理
立志终生学习
原文来源: https://blog.csdn.net/sonwing_for/article/details/81751072