Java 中模仿源碼自定義ArrayList
更新時間:2017年03月27日 08:54:41 投稿:lqh
這篇文章主要介紹了Java 中模仿源碼自定義ArrayList的相關資料,需要的朋友可以參考下
Java 中模仿源碼自定義ArrayList
最近看了下ArrayList的源碼,抽空根據ArrayList的底層結構寫了一個功能簡單無泛型的自定義ArrayLsit,幫助自己更好理解ArrayList:,其實現的底層數據結構為數Object組,代碼如下:
/** * 自己實現一個ArrayList * */ public class MyArrayList { private Object[] elementData; private int size; public int size(){ return size; } public boolean isEmpty(){ return size==0; } //默認容量為10 public MyArrayList(){ this(10); } /** * 自定義容量 * @param initialCapacity */ public MyArrayList(int initialCapacity){ if(initialCapacity<0){ try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } elementData = new Object[initialCapacity]; } /** * 添加一個元素 * @param obj */ public void add(Object obj){ //數組擴容和數據的拷貝,重新new一個數組 if(size==elementData.length){ Object[] newArray = new Object[size*2+1]; System.arraycopy(elementData, 0, newArray, 0, elementData.length); elementData = newArray; } elementData[size++]=obj; // size++; } /** * 通過索引獲取元素 * @param index * @return */ public Object get(int index){ rangeCheck(index); return elementData[index]; } /** * 通過索引刪除元素 * @param index */ public void remove(int index){ rangeCheck(index); int numMoved = size - index - 1; if (numMoved > 0){ System.arraycopy(elementData, index+1, elementData, index, numMoved); } elementData[--size] = null; // Let gc do its work } /** * 刪除對應的元素(利用equal判斷元素是否一致) * @param obj */ public void remove(Object obj){ for(int i=0;i<size;i++){ if(get(i).equals(obj)){ //注意:底層調用的equals方法而不是==. remove(i); } } } /** * 設置索引對應的元素 * @param index * @param obj * @return */ public Object set(int index,Object obj){ rangeCheck(index); Object oldValue = elementData[index]; elementData[index] = obj; return oldValue; } /** * 將元素插入對應的位置 * @param index * @param obj */ public void add(int index,Object obj){ rangeCheck(index); ensureCapacity(); //數組擴容 System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = obj; size++; } /** * 數組擴容 */ private void ensureCapacity(){ //數組擴容和數據的拷貝 if(size==elementData.length){ Object[] newArray = new Object[size*2+1]; System.arraycopy(elementData, 0, newArray, 0, elementData.length); // for(int i=0;i<elementData.length;i++){ // newArray[i] = elementData[i]; // } elementData = newArray; } } /** * 數組下標檢查 * @param index */ private void rangeCheck(int index){ if(index<0||index>=size){ try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { MyArrayList list = new MyArrayList(3); list.add("333"); list.add("444"); list.add("5"); list.add("344433"); list.add("333"); list.add("333"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } System.out.println("------------------------------"); list.remove("444"); list.add(2, "a"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } }
測試結果:
333 444 5 344433 333 333 ------------------------------ 333 5 a 344433 333 333
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
Springmvc DispatcherServlet原理及用法解析
這篇文章主要介紹了Springmvc DispatcherServlet原理及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09SpringBoot監(jiān)聽Nacos動態(tài)修改日志級別的操作方法
線上系統(tǒng)的日志級別一般都是 INFO 級別,有時候需要查看 WARN 級別的日志,所以需要動態(tài)修改日志級別,微服務項目中使用 Nacos 作為注冊中心,我們可以監(jiān)聽 Nacos 配置,修改日志級別,這篇文章主要介紹了SpringBoot監(jiān)聽Nacos動態(tài)修改日志級別的操作方法,需要的朋友可以參考下2023-12-12HttpServletRequest對象簡介_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了HttpServletRequest對象簡介的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07Java 實戰(zhàn)項目之CRM客戶管理系統(tǒng)的實現流程
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現一個CRM客戶管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11