初版:
public interface ArrayList<E> { public int size(); // 元素的数量 public boolean isEmpty(); // 是否为空 public boolean contains(int element); // 是否包含某个元素 public void add(int element); // 添加元素到最后面 public int get(int index); // 返回index位置对应的元素 public int set(int index, int element); // 设置index位置的元素 public void add(int index, int element); // 往index位置添加元素 public int remove(int index); // 删除index位置对应的元素 public int indexOf(int element); // 查看元素的位置 public void clear(); // 清除所有元素}
package com.test;@SuppressWarnings("unchecked")public class MyArrayList<E> implements ArrayList<E> { /** * 元素的数量 */ private int size; /** * 元素的原始数组,存放变动元素的数组 */ private int[] elements; /** * 默认容量 */ private static final int DEFAULT_CAPACITY = 10; /** * 元素错误值 */ private static final int ELEMENT_NOT_FOUND = -1; /** * 构造函数,创建一个固定大小 数组 * * @param capaticy 容量 */ public MyArrayList(int capaticy) { // 固定数组 // elements = new int[capaticy]; // 修改为动态数组,即如果容量小于默认值,那么直接使用默认10大小的容量 // 否则使用大于10默认值的容量 // 以此来创建灵活多变的数组 capaticy = (capaticy < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capaticy; elements = new int[capaticy]; } /** * 默认一个10位大小的整数型数组 */ public MyArrayList() { // elements = new int[10]; // elements = new int[DEFAULT_CAPACITY]; // 调用构造函数 this(DEFAULT_CAPACITY); } /** * 元素的数量 */ @Override public int size() { return size; } /** * 是否为空 */ @Override public boolean isEmpty() { return size == 0; } /** * 是否包含某个元素 */ @Override public boolean contains(int element) { // 查找元素索引存在吗,不存在则false,存在为true return indexOf(element) != ELEMENT_NOT_FOUND; } /** * 添加元素到最后面 */ @Override public void add(int element) { // elements[size++] = element; // size++; add(this.size, element); } /** * 返回index位置对应的元素 * * @param index 索引 */ @Override public int get(int index) { // 如果索引小于0或者索引大于元素的数量// if (index < 0 || index >= size) {// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);// } rangeCheck(index); // 返回对应索引位置的元素数组 return elements[index]; } /** * 设置index位置的元素 * * @param index 修改索引 * @param element 修改元素值 */ @Override public int set(int index, int element) { // 如果索引小于0或者索引大于元素的数量// if (index < 0 || index >= size) {// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);// } rangeCheck(index); // 拿到元素组对应的值 int old = elements[index]; // 将要修改元素值赋值给原元素值 elements[index] = element; // 返回结果-被修改后的元素值 return old; } /** * 往index位置添加元素 */ @Override public void add(int index, int element) {// if (index < 0 || index > size) {// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);// } rangeCheckForAdd(index); ensureCapacity(size + 1); for (int i = size - 1; i >= index; i--) { elements[i + 1] = elements[i]; } elements[index] = element; size++; } /** * 扩容 * * @param capacity */ private void ensureCapacity(int capacity) { int oldCapacity = elements.length; if (oldCapacity >= capacity) { return; } int newCapactiy = oldCapacity + (oldCapacity >> 2); int[] newElements = new int[newCapactiy]; for (int i = 0; i < elements.length; i++) { newElements[i] = elements[i]; } elements = newElements; } /** * 删除index位置对应的元素 */ @Override public int remove(int index) { // 如果索引小于0或者索引大于元素的数量// if (index < 0 || index >= size) {// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);// } rangeCheck(index); // int old = elements[index]; for (int i = index + 1; i <= size - 1; i++) { elements[i - 1] = elements[i]; size--; } return old; } /** * 查看元素的位置 */ @Override public int indexOf(int element) { // 遍历元素数组里面的所有值 for (int i = 0; i < size; i++) { // 如果该元素值和查询元素值相等 if (elements[i] == element) { // 返回该元素索引 return i; } } // 否则,返回 -1 return ELEMENT_NOT_FOUND; } /** * 清除所有元素 */ @Override public void clear() { // 不清空数组,保留数组的内存,方便下次添加使用,避免重新创建数组,减少栈堆消耗 size = 0; } @Override public String toString() { // 打印格式:[100,50,101] StringBuilder builder = new StringBuilder(); builder.append("size = ").append(size).append(", body = ["); for (int i = 0; i < size; i++) { if (i != 0) { builder.append(", "); } builder.append(elements[i]); } builder.append("]"); return builder.toString(); } private void outOfBounds(int index) { throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); } private void rangeCheck(int index) { if (index < 0 || index >= size) { outOfBounds(index); } } private void rangeCheckForAdd(int index) { if (index < 0 || index > size) { outOfBounds(index); } }}
最终版:
public interface ArrayList2<E> { public int size(); // 元素的数量 public boolean isEmpty(); // 是否为空 public boolean contains(E element); // 是否包含某个元素 public void add(E element); // 添加元素到最后面 public E get(int index); // 返回index位置对应的元素 public E set(int index, E element); // 设置index位置的元素 public void add(int index, E element); // 往index位置添加元素 public E remove(int index); // 删除index位置对应的元素 public int indexOf(E element); // 查看元素的位置 public void clear(); // 清除所有元素}
@SuppressWarnings("unchecked")public class MyArrayList2<E> implements ArrayList2<E> { /** * 元素的数量 */ private int size; /** * 元素的原始数组,存放变动元素的数组 */ private E[] elements; /** * 默认容量 */ private static final int DEFAULT_CAPACITY = 10; /** * 元素错误值 */ private static final int ELEMENT_NOT_FOUND = -1; /** * 构造函数,创建一个固定大小 数组 * * @param capaticy 容量 */ public MyArrayList2(int capaticy) { // 固定数组 // elements = new int[capaticy]; // 修改为动态数组,即如果容量小于默认值,那么直接使用默认10大小的容量 // 否则使用大于10默认值的容量 // 以此来创建灵活多变的数组 capaticy = (capaticy < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capaticy; elements = (E[]) new Object[capaticy]; } /** * 默认一个10位大小的整数型数组 */ public MyArrayList2() { // elements = new int[10]; // elements = new int[DEFAULT_CAPACITY]; // 调用构造函数 this(DEFAULT_CAPACITY); } /** * 元素的数量 */ @Override public int size() { return size; } /** * 是否为空 */ @Override public boolean isEmpty() { return size == 0; } /** * 是否包含某个元素 */ @Override public boolean contains(E element) { // 查找元素索引存在吗,不存在则false,存在为true return indexOf(element) != ELEMENT_NOT_FOUND; } /** * 添加元素到最后面 */ @Override public void add(E element) { // elements[size++] = element; // size++; add(this.size, element); } /** * 返回index位置对应的元素 * * @param index 索引 */ @Override public E get(int index) { // 如果索引小于0或者索引大于元素的数量// if (index < 0 || index >= size) {// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);// } rangeCheck(index); // 返回对应索引位置的元素数组 return elements[index]; } /** * 设置index位置的元素 * * @param index 修改索引 * @param element 修改元素值 */ @Override public E set(int index, E element) { // 如果索引小于0或者索引大于元素的数量// if (index < 0 || index >= size) {// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);// } rangeCheck(index); // 拿到元素组对应的值 E old = elements[index]; // 将要修改元素值赋值给原元素值 elements[index] = element; // 返回结果-被修改后的元素值 return old; } /** * 往index位置添加元素 */ @Override public void add(int index, E element) {// if (index < 0 || index > size) {// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);// } rangeCheckForAdd(index); ensureCapacity(size + 1); for (int i = size - 1; i >= index; i--) { elements[i + 1] = elements[i]; } elements[index] = element; size++; } /** * 扩容 * * @param capacity */ private void ensureCapacity(int capacity) { int oldCapacity = elements.length; if (oldCapacity >= capacity) { return; } int newCapactiy = oldCapacity + (oldCapacity >> 1); E[] newElements = (E[]) new Object[newCapactiy]; for (int i = 0; i < size; i++) { newElements[i] = elements[i]; } elements = newElements; } /** * 删除index位置对应的元素 */ @Override public E remove(int index) { // 如果索引小于0或者索引大于元素的数量// if (index < 0 || index >= size) {// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);// } rangeCheck(index); // 获取该索引下的元素值 E old = elements[index]; // 从索引下一个位置处开始,到数组的数量遍历 for (int i = index + 1; i <= size - 1; i++) { elements[i - 1] = elements[i]; size--; } // 将size-1处的元素置为null,让垃圾回收器进行自动回收 elements[--size] = null; return old; } /** * 查看元素的位置 */ @Override public int indexOf(E element) { if (element == null) { // 1 for (int i = 0; i < size; i++) { if (elements[i] == null) return i; } } else { // 遍历元素数组里面的所有值 for (int i = 0; i < size; i++) { // 如果该元素值和查询元素值相等 if (elements[i] == element) { // 返回该元素索引 return i; } } } // 否则,返回 -1 return ELEMENT_NOT_FOUND; } /** * 清除所有元素 */ @Override public void clear() { for (int i = 0; i < size; i++) { elements[i] = null; } // 不清空数组,保留数组的内存,方便下次添加使用,避免重新创建数组,减少栈堆消耗 size = 0; } @Override public String toString() { // 打印格式:[100,50,101] StringBuilder builder = new StringBuilder(); builder.append("size = ").append(size).append(", body = ["); for (int i = 0; i < size; i++) { if (i != 0) { builder.append(", "); } builder.append(elements[i]); } builder.append("]"); return builder.toString(); } private void outOfBounds(int index) { throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); } private void rangeCheck(int index) { if (index < 0 || index >= size) { outOfBounds(index); } } private void rangeCheckForAdd(int index) { if (index < 0 || index > size) { outOfBounds(index); } }}
测试:
public class Main { public static void main(String[] args) { ArrayList<Object> list = new MyArrayList<>(); // 添加元素11 list.add(11); list.add(100); list.add(11); // 将22添加到下标0的元素// list.add(0,22); System.out.println(list); // 删除下标为1的元素 list.remove(1); System.out.println(list); }}
结果:
size = 3, body = [11, 100, 11]size = 2, body = [11, 11]