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