java用陣列模擬實現ArrayList以及一些常用方法實現
阿新 • • 發佈:2019-01-07
package com.yys.student; /** * Created by yys on 2017/5/4. */ public class SxtArrayList { private Object[] elementDate; private int size; /** * 預設無參構造方法 SxtArrayList() */ public SxtArrayList(){ this(10); } /** * 預設帶參構造方法 SxtArrayList(int initialCapacity) */ public SxtArrayList(intinitialCapacity){ if(initialCapacity<0){ try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } elementDate = new Object[initialCapacity]; } /** * 返回list大小 size() * 返回SxtArrayList物件大小即SxtArrayList中陣列大小*/ public int size(){ return size; } /** * 判斷list是否為空 isEmpty() 此方法待改進 初始化時並未使用size 只有add時候用到size屬性 直接判斷size不正確 * 返回SxtArrayList物件是否為空即SxtArrayList中陣列中是否有實際值 */ public boolean isEmpty(){ return size == 0; } /** * 新增物件 add(Object obj) * ensureCapacity()檢查陣列是否需要陣列擴容和資料拷貝 後新增元素* 返回 null */ public void add(Object obj){ //陣列擴容和資料拷貝 ensureCapacity(); elementDate[size++] = obj; } /** * 指定位置新增物件 原來此位置物件後移 add(int index , Object object) * rangeCheck(index)檢驗陣列下標是否越界 * ensureCapacity()檢查陣列是否需要陣列擴容和資料拷貝 * 然後進行原來陣列內容向後移動 * 最後把新值傳入相應位置 * 陣列長度++ * 返回 null */ public void add(int index , Object object){ //檢驗陣列下標是否越界 rangeCheck(index); //陣列擴容和資料拷貝 ensureCapacity(); //第一個是要複製的陣列,第二個是從要複製的陣列的第幾個開始, //第三個是複製到那,四個是複製到的陣列第幾個開始,最後一個是複製長度 System.arraycopy(elementDate,index,elementDate,index+1 ,size-index); elementDate[index] = object; size++; } /** * 獲取指定位置物件 get() * rangeCheck(index)檢驗陣列下標是否越界 * 返回陣列對應值(object) */ public Object get(int index){ rangeCheck(index); return elementDate[index]; } /** * 刪除指定位置物件 remove(int index) * rangeCheck(index)檢驗陣列下標是否越界 * 刪除物件前計算出要刪除的物件後面還剩多少物件以便於後面元素向前移動 * 移動物件 * 原陣列最後一位設定為空 * 如果刪除物件在陣列最後一位則直接刪除無需陣列元素移動 * 返回 null */ public void remove(int index){ rangeCheck(index); int numMove = size - index -1; if(numMove > 0){ //第一個是要複製的陣列,第二個是從要複製的陣列的第幾個開始, //第三個是複製到那,四個是複製到的陣列第幾個開始,最後一個是複製長度 System.arraycopy(elementDate,index +1,elementDate,index,numMove); elementDate[--size] = null; }else if(numMove == 0){ elementDate[--size] = null; } } /** * 重新設定指定位置物件 set(int index,Object object) * rangeCheck(index)檢驗陣列下標是否越界 * 獲取對應下標物件 暫定為舊物件 * 對應下標物件重新賦值 * 返回 舊物件 */ public Object set(int index,Object object){ rangeCheck(index); Object oldValue = elementDate[index]; elementDate[index] = object; return oldValue; } /** * 刪除指定物件 remove(Object obj) * 判斷傳入物件是否存在 * 如果存在則會得到相應下標位置 * 利用下標位置刪除此元素 * 返回 null */ public void remove(Object obj){ for(int i=0;i<size;i++){ if(get(i).equals(obj)){//底層是equls remove(i); } } } /** * 檢驗陣列下標是否越界 */ private void rangeCheck(int index){ if(index<0 || index>=size){ try { throw new Exception("下標越界"); } catch (Exception e) { e.printStackTrace(); } } } /** * 陣列擴容和資料拷貝 */ private void ensureCapacity(){ if(size==elementDate.length){ Object[] newArray = new Object[size*2+1]; System.arraycopy(elementDate,0,newArray,0,elementDate.length); // System.arraycopy()代替for迴圈 // for(int i=0;i<elementDate.length;i++){ // newArray[i] = elementDate[i]; // } elementDate = newArray; } } public static void main(String args[]){ SxtArrayList sxtArrayList = new SxtArrayList(1); sxtArrayList.add("3"); sxtArrayList.add(0,"2"); sxtArrayList.add(0,"1"); sxtArrayList.set(2,"4"); for(int i=0;i<sxtArrayList.size();i++){ System.out.println(sxtArrayList.get(i)); } sxtArrayList.remove(0); sxtArrayList.remove("4"); System.out.println("執行 remove(0) 和remove(\"4\")後剩餘元素"); for(int i=0;i<sxtArrayList.size();i++){ System.out.println(sxtArrayList.get(i)); } sxtArrayList.remove(0); System.out.println("執行 remove(0)否為空 "+sxtArrayList.isEmpty()); } }