1、动态数组
1、数组
数组是一种顺序存储的线性表,所有的元素的内存地址都是连续的。

2、对象数组
对象数组就是存储一些相关对象地址的数组。如下图所示。

3、null值处理
关于数组中是否可以存储null取决于自身的设计。
注意:
1、如果可以存储null值,那么要对代码中equals()等函数经行相关的逻辑处理。防止空指针异常。
2、如果要删除对象数组中的某个元素,可以将该值置为null,后续会由java的垃圾回收机制(回收没有被其他变量所引用的堆空间)自动回收。
4、仿照java的Arraylist类动态数组的java代码
public class ArrayList<E> { //元素数量 private int size; //所有的元素 private E[] elements; //默认容量 private static final int DEFAULT_CAPACITY = 8; //元素未找到 private static final int ELEMENT_NOT_FOUNT = -1; public ArrayList(int capacity) { capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity; elements = (E[]) new Object[capacity]; } public ArrayList() { this(DEFAULT_CAPACITY); } /** * 清楚所有元素 * 注意这里是对象数组!!!想删除数组中的元素要置为null即销毁对象 */ public void clear() { for (int i = 0; i < size; i++) { elements[i] = null; } size = 0; } /** * 返回元素的数量 * * @return */ public int size() { return this.size; } /** * 是否为空 * * @return */ public boolean isEmpty() { return size == 0; } /** * 是否包含某个元素 * * @param element * @return */ public boolean contains(E element) { return indexOf(element) != ELEMENT_NOT_FOUNT; } /** * 添加元素到尾部 * * @param element */ public void add(E element) { this.add(size, element); } /** * 获取index位置的元素 * * @param index * @return */ public E get(int index) { rangeCheck(index); return elements[index]; } /** * 设置index位置的元素 * * @param index * @param element * @return */ public E set(int index, E element) { rangeCheck(index); E old = elements[index]; elements[index] = element; return old; } /** * 在index位置插入元素 * * @param index * @param element * @return */ public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacity(size + 1); //for (int i = size - 1; i >= index; i--) { // elements[i + 1] = elements[i]; //} // 优化 for (int i = size ; i > index; i--) { elements[i] = elements[i - 1]; } elements[index] = element; size++; } /** * 删除index位置的元素 * * @param index * @return */ public E remove(int index) { rangeCheck(index); E old = elements[index]; for (int i = index + 1; i < size ; i++) { elements[i - 1] = elements[i]; } //size--; elements[--size] = null; return old; } /** * 查看元素的索引 * * @param element * @return */ public int indexOf(E element) { // 数组允许存储null,因此单独处理 if (element == null) { for (int i = 0; i < size; i++) { if (elements[i] == null) { return i; } } } else { for (int i = 0; i < size; i++) { // 注意element要放前面 if (element.equals(elements[i])) { return i; } } } return ELEMENT_NOT_FOUNT; } @Override public String toString() { StringBuilder str = new StringBuilder(); str.append("size = ").append(size).append(",elements = ["); for (int i = 0; i < size; i++) { //先添加 ',' 在填充元素,推荐该方式,少一步减法操作 if (i != 0) { str.append(", "); } str.append(elements[i]); //if (i != size - 1){ // str.append(", "); //} } str.append("]"); return str.toString(); } /** * 保证数组有capacity的容量 * 如果没有capacity容量 则扩容 * * @param capacity 数组当前应有的元素数量 */ private void ensureCapacity(int capacity) { // 当前数组的最大容量 int oldCapacity = elements.length; if (oldCapacity >= capacity) { return; } // 新容量为旧容量的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1); E[] newElements = (E[]) new Object[newCapacity]; for (int i = 0; i < size; i++) { newElements[i] = elements[i]; } elements = newElements; System.out.println(oldCapacity + "扩容为: " + newCapacity); } 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); } } }

浙公网安备 33010602011771号