您好,登錄后才能下訂單哦!
本篇文章為大家展示了Java 項(xiàng)目中如何實(shí)現(xiàn)自定義ArrayList,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
Java 中模仿源碼自定義ArrayList
最近看了下ArrayList的源碼,抽空根據(jù)ArrayList的底層結(jié)構(gòu)寫了一個(gè)功能簡(jiǎn)單無泛型的自定義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++; } /** * 通過索引獲取元素 * @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 } /** * 刪除對(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
上述內(nèi)容就是Java 項(xiàng)目中如何實(shí)現(xiàn)自定義ArrayList,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。