public class FirstArray<E> { // 默认数组容量 public static int default_capacity = 16; // 扩容因子 public static float factor = 0.75f; private E[] data; private int size = 0; private int capacity = default_capacity; public FirstArray() { data = (E[])new Object[default_capacity]; } public FirstArray(int capacity) { data = (E[])new Object[capacity]; this.capacity = capacity; } public E get(int index) { if (index - size > 0 || index < 0) { throw new RuntimeException("索引值超出数组范围"); } return data[index]; } public void add(E e) { // 是否需要扩容或缩容 updateCapacity(); data[size] = e; size++; } public void add(E e, int index) { if (index - size > 0 || index < 0) { throw new RuntimeException("索引值超出数组范围"); } // 是否需要扩容或缩容 updateCapacity(); E[] temp = (E[])new Object[size - index]; int j = 0; for (int i = index; i < size; i++) { temp[j] = data[i]; } data[index] = e; for (int i = 0; i < temp.length; i++) { data[index + i + 1] = temp[i]; } } public void remove() { size--; data[size] = null; updateCapacity(); } public void remove(int index) { for (int i = index; i < size; i++) { data[i] = data[i + 1]; } remove(); } public void expand() { capacity = capacity * 2; data = copy(); } public void reduce() { capacity = capacity / 2; data = copy(); } public E[] copy() { E[] temp = (E[])new Object[capacity]; for (int i = 0; i < size; i++) { temp[i] = data[i]; } return temp; } public int size() { return size; } private void updateCapacity() { if (size != 0 && ((float) size / capacity - factor) > 0) { // 扩容 expand(); } else if (size != 0 && capacity > default_capacity && ((float) size / capacity - factor/4) < 0) { // 缩容 reduce(); } } @Override public String toString() { return "FirstArray{" + "data=" + Arrays.toString(data) + ", size=" + size + ", capacity=" + capacity + '}'; } public static void main(String[] args) { FirstArray<Integer> firstArray = new FirstArray<>(); for (int i = 0; i < 51; i++) { firstArray.add(i); } System.out.println(firstArray); System.out.println(firstArray.get(50)); // 期望值 50 for (int i = 45; i >= 0; i--) { firstArray.remove(i); } System.out.println(firstArray); System.out.println(firstArray.get(0)); // 期望值 46 FirstArray<Integer> intArray = new FirstArray<>(32); intArray.add(0); System.out.println(intArray); // 期望值 size = 1, 容量 = 32 } }