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); } } }