Java 中模仿源碼自定義ArrayList
Java 中模仿源碼自定義ArrayList
最近看了下ArrayList的源碼,抽空根據(jù)ArrayList的底層結(jié)構(gòu)寫了一個功能簡單無泛型的自定義ArrayLsit,幫助自己更好理解ArrayList:,其實現(xiàn)的底層數(shù)據(jù)結(jié)構(gòu)為數(shù)Object組,代碼如下:
/** * 自己實現(xiàn)一個ArrayList * */ public class MyArrayList { private Object[] elementData; private int size; public int size(){ return size; } public boolean isEmpty(){ return size==0; } //默認(rèn)容量為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){ //數(shù)組擴(kuò)容和數(shù)據(jù)的拷貝,重新new一個數(shù)組 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 } /** * 刪除對應(yīng)的元素(利用equal判斷元素是否一致) * @param obj */ public void remove(Object obj){ for(int i=0;i<size;i++){ if(get(i).equals(obj)){ //注意:底層調(diào)用的equals方法而不是==. remove(i); } } } /** * 設(shè)置索引對應(yīng)的元素 * @param index * @param obj * @return */ public Object set(int index,Object obj){ rangeCheck(index); Object oldValue = elementData[index]; elementData[index] = obj; return oldValue; } /** * 將元素插入對應(yīng)的位置 * @param index * @param obj */ public void add(int index,Object obj){ rangeCheck(index); ensureCapacity(); //數(shù)組擴(kuò)容 System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = obj; size++; } /** * 數(shù)組擴(kuò)容 */ private void ensureCapacity(){ //數(shù)組擴(kuò)容和數(shù)據(jù)的拷貝 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; } } /** * 數(shù)組下標(biāo)檢查 * @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)); } } }
測試結(jié)果:
333 444 5 344433 333 333 ------------------------------ 333 5 a 344433 333 333
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Springmvc DispatcherServlet原理及用法解析
這篇文章主要介紹了Springmvc DispatcherServlet原理及用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09SpringBoot監(jiān)聽Nacos動態(tài)修改日志級別的操作方法
線上系統(tǒng)的日志級別一般都是 INFO 級別,有時候需要查看 WARN 級別的日志,所以需要動態(tài)修改日志級別,微服務(wù)項目中使用 Nacos 作為注冊中心,我們可以監(jiān)聽 Nacos 配置,修改日志級別,這篇文章主要介紹了SpringBoot監(jiān)聽Nacos動態(tài)修改日志級別的操作方法,需要的朋友可以參考下2023-12-12HttpServletRequest對象簡介_動力節(jié)點Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了HttpServletRequest對象簡介的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07IDEA 如何控制編輯左側(cè)的功能圖標(biāo)ICON(操作步驟)
很多朋友被idea左側(cè)的圖標(biāo)不見了這一問題搞的焦頭爛額,不知道該怎么操作,今天小編就交大家如何控制編輯左側(cè)的功能圖標(biāo) ICON,文字內(nèi)容不多,主要通過兩張截圖給大家說明,感興趣的朋友一起看看吧2021-05-05Java實現(xiàn)動態(tài)規(guī)劃背包問題
本文主要介紹使用java實現(xiàn)動態(tài)規(guī)劃的背包問題,詳細(xì)使用圖文和多種案例進(jìn)行解析,幫助理解該算法2021-06-06Java 實戰(zhàn)項目之CRM客戶管理系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)一個CRM客戶管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11Java經(jīng)典設(shè)計模式之觀察者模式原理與用法詳解
這篇文章主要介紹了Java經(jīng)典設(shè)計模式之觀察者模式,簡單分析了觀察者模式的概念、原理并結(jié)合實例形式給出了java觀察者模式的具體用法與相關(guān)注意事項,需要的朋友可以參考下2017-08-08Java中如何使用?byte?數(shù)組作為?Map?的?key
本文將討論在使用HashMap時,當(dāng)byte數(shù)組作為key時所遇到的問題及其解決方案,介紹使用String和List這兩種數(shù)據(jù)結(jié)構(gòu)作為臨時解決方案的方法,感興趣的朋友跟隨小編一起看看吧2023-06-06