参照Java源码,自定义实现动态数组ArrayList:
主要实现数组的增、删、查、改方法,实现过程中要考虑:
实现代码大致如下:
import java.util.Arrays;public class ArrayList<E> { /* * 数组的大小 * */ private int size; /* * 存放元素的数组 * */ private E[] elements; private static final int DEFAULT_CAPACITY = 10; private static final int ELEMENT_NOT_FOUND = -1; public ArrayList(int lenth) { lenth = (lenth < DEFAULT_CAPACITY)? DEFAULT_CAPACITY : lenth; elements = (E[]) new Object[lenth]; } public ArrayList() { this(DEFAULT_CAPACITY); } /* * 给数组添加一个元素 * */ public void add(E element){ add(size,element); } /* * 在指定位置添加一个元素 * */ public void add(int index,E element){ checkForAddRange(index); //先确认一下新加一个元素是否有容量 ensureCapacity(size + 1); //从末尾到index的每一个元素都要往后挪挪位置 for (int i = size; i > index;i--){ elements[i] = elements[i -1]; } elements[index] = element; size++; } /* * 删除指定位置的元素 * */ public E delete(int index){ checkForRange(index); E old = elements[index]; //从index到末尾的每一个元素都要往前挪一位 for (int i = index+1; i < size; i++){ elements[i-1] = elements[i]; } elements[--size] = null; return old; } /* * 获取指定位置的元素 * */ public E get(int index){ checkForRange(index); return elements[index]; } /* * 根据元素找到其所在位置的下标 * */ public int indexOf(E element){ if (element == null){ for (int i = 0;i < size;i++){ if (elements[i] == null) return i; } }else { for (int i = 0; i<size ;i++){ if (elements[i].equals(element)) return i; } } return ELEMENT_NOT_FOUND; } /* * 将指定位置的元素替换 * */ public E set(int index,E element){ checkForRange(index); E old = elements[index]; elements[index] = element; return old; } /* *清除所有的元素 * */ public void clear(){ for (int i = 0 ; i < size; i++){ elements[i] = null; } size = 0; } /* * 素组的大小 * */ public int size(){ return size; } /* * 素组是否为空 * */ public boolean isEmpty(){ return size == 0; } /* * 判断素组是否包含某元素 * */ public boolean contains(E element){ return indexOf(element) != ELEMENT_NOT_FOUND; } /* * 添加元素时候检查位置是否正确 * */ private void checkForAddRange(int index){ if (index < 0 || index > size) throw new IndexOutOfBoundsException("Index: [" + index + "] is not a valid index"); } /* * 检查指定位置是否存在 * */ private void checkForRange(int index){ if (index < 0 || index >= size) throw new IndexOutOfBoundsException("Index: [" + index + "] is not a valid index"); } private void ensureCapacity(int capacity){ int oldCapacity = elements.length; if (oldCapacity >= capacity) return; //容量不够 在原来的基础上 + 0.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1); //把旧的数组挪到新的数组上来 E[] newElements = (E[]) new Object[newCapacity]; for (int i = 0;i < oldCapacity;i++){ newElements[i] = elements[i]; } elements = newElements; } @Override public String toString() { return "ArrayList{" + "size=" + size + ", elements=" + Arrays.toString(elements) + ‘}‘; } }
基本实现主要功能,测试代码:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘; } @Override public boolean equals(Object obj) { if (obj == null) return false; if (obj instanceof Person){ Person person = (Person) obj; if (person.age == this.age && person.name.equals(this.name)) return true; } return false; } }
public class Main { public static void main(String[] args) { ArrayList<Person> list = new ArrayList<>(); for (int i = 0; i < 3; i++){ list.add(new Person("role" + i,18)); } System.out.println(list.toString()); list.add(2,new Person("Jack",22)); System.out.println(list.toString()); list.delete(3); System.out.println(list.toString()); System.out.println(list.contains(new Person("Jack",22))); list.clear(); System.out.println(list.toString()); } }
测试截图:
原文:https://www.cnblogs.com/zhvip/p/14033544.html