国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

JAVA基礎(chǔ)整理(四)---手寫(xiě)簡(jiǎn)單的arraylist來(lái)學(xué)習(xí)arraylist

liuchengxu / 991人閱讀

摘要:傳入的構(gòu)造對(duì)進(jìn)行判斷,大于的情況處理一樣的,等于的話(huà)還是調(diào)用了靜態(tài)的那個(gè)空對(duì)象,小于拋出非法長(zhǎng)度的異常。查找元素差別不大,就是返回的元素。

ArrayList類(lèi)

通過(guò)自定義的arraylist類(lèi)與jdk源碼里的ArrayList的實(shí)現(xiàn)的對(duì)比學(xué)習(xí):

1.所需的變量:

private Object[] elementData;
private int size;
private static final int DEFAULT_LENGTH=10;

private static final int DEFAULT_CAPACITY = 10;
transient Object[] elementData;
private int size;

(1)默認(rèn)長(zhǎng)度設(shè)置成static final 因?yàn)檫@個(gè)是不隨具體對(duì)象改變的,是屬于類(lèi)的通用不變屬性。

(2)為什么要把核心數(shù)組定義成 transient 數(shù)據(jù)類(lèi)型,大概是因?yàn)樾蛄谢头葱蛄谢倪^(guò)程類(lèi)要自己做,不要用默認(rèn)的,至于原因深入后再談。

2.構(gòu)造函數(shù)

1.無(wú)參構(gòu)造

public MyList(){

elementData = new Object[DEALULT_LENGTH];

}

public ArrayList() {

this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

}
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

無(wú)參構(gòu)造可以定義成static final ,沒(méi)必要每次都new一個(gè)新的空對(duì)象。

2.傳入length的構(gòu)造

public MyList(int length){

elementData = new Object[length];

}

public ArrayList(int initialCapacity) {

if (initialCapacity > 0) {
    this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
    this.elementData = EMPTY_ELEMENTDATA;
} else {
    throw new IllegalArgumentException("Illegal Capacity: "+
                                       initialCapacity);
}

}

對(duì)length進(jìn)行判斷,大于0的情況處理一樣的,等于0的話(huà)還是調(diào)用了靜態(tài)的那個(gè)空對(duì)象,小于0拋出非法長(zhǎng)度的異常。

3.增加元素

public void add(E obj){

Object[] newArray;
if(size == elementData.length) {
    newArray = new Object[elementData.length + (elementData.length >> 1)];
    System.arraycopy(elementData, 0, newArray, 0, elementData.length);
    elementData=newArray;
}
    elementData[size++]=obj;

}

public boolean add(E e) {

ensureCapacityInternal(size + 1);  // Increments modCount!!
elementData[size++] = e;
return true;

}

add的差別比較大,MyList的簡(jiǎn)單邏輯:判斷目前存的size與elementData的長(zhǎng)度的大小,如果size等于開(kāi)的長(zhǎng)度的話(huà),再存進(jìn)去會(huì)溢出,所以需要數(shù)組擴(kuò)容,擴(kuò)容的基本步驟:開(kāi)一個(gè)新的數(shù)組,長(zhǎng)度是原來(lái)的1.5倍(>>1就是加上了一半,這樣運(yùn)算快點(diǎn)),將原來(lái)數(shù)組的東西拷貝到新數(shù)組的前面,將新數(shù)組指向elementData數(shù)組,把obj存進(jìn)新數(shù)組里。

源碼的邏輯多了幾層判斷,最終的擴(kuò)容操作邏輯也是大同小異的:

private void grow(int minCapacity) {

// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
    newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
    newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);

}

4.刪除元素

public void remove(int index){

for(int i=index+1;i

}

將index后的元素前移一位,size--;

public E remove(int index) {

rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
    System.arraycopy(elementData, index+1, elementData, index,
                    numMoved);
elementData[--size] = null; // clear to let GC do its work

return oldValue;

}

源碼里remove后返回了刪除的值,并且多了一個(gè)rangecheck的函數(shù)進(jìn)行index判斷,因?yàn)檫@個(gè)功能很多地方都可以用到,相似的。

private void rangeCheck(int index) {

if (index >= size)
    throw new IndexOutOfBoundsException(outOfBoundsMsg(index));

}

移動(dòng)使用的是for循環(huán),源碼使用了copy方法,做一個(gè)時(shí)間的測(cè)試:

5.修改元素

public void set(int index,E obj){

elementData[index]=obj;

}

public E set(int index, E element) {

rangeCheck(index);

E oldValue = elementData(index);
elementData[index] = element;
return oldValue;

}

也是多了一個(gè)rangecheck的判斷,然后返回了舊的的value。

6.查找元素

public E get(int index){

return (E)elementData[index];

}

public E get(int index) {

rangeCheck(index);
checkForComodification();
return ArrayList.this.elementData(offset + index);

}

差別不大,就是返回elementdata的index元素。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/77678.html

相關(guān)文章

  • 一份送給Java初學(xué)者指南

    摘要:編程思想第版這本書(shū)要常讀,初學(xué)者可以快速概覽,中等程序員可以深入看看,老鳥(niǎo)還可以用之回顧的體系。以下視頻整理自慕課網(wǎng)工程師路徑相關(guān)免費(fèi)課程。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問(wèn)題,目前已經(jīng)開(kāi)源,會(huì)一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snailclimb/Java-Guide 筆者建議初學(xué)者學(xué)習(xí)Java的方式:看書(shū)+視頻+實(shí)踐(初...

    banana_pi 評(píng)論0 收藏0
  • 集合Collection總覽

    前言 聲明,本文使用的是JDK1.8 從今天開(kāi)始正式去學(xué)習(xí)Java基礎(chǔ)中最重要的東西--->集合 無(wú)論在開(kāi)發(fā)中,在面試中這個(gè)知識(shí)點(diǎn)都是非常非常重要的,因此,我在此花費(fèi)的時(shí)間也是很多,得參閱挺多的資料,下面未必就做到日更了... 當(dāng)然了,如果講得有錯(cuò)的地方還請(qǐng)大家多多包涵并不吝在評(píng)論去指正~ 一、集合(Collection)介紹 1.1為什么需要Collection Java是一門(mén)面向?qū)ο蟮恼Z(yǔ)言,...

    FullStackDeveloper 評(píng)論0 收藏0
  • 經(jīng)過(guò)了這么多場(chǎng)Java面試,我明白了這些道理

    摘要:的長(zhǎng)度為什么是的冪次方多線(xiàn)程并發(fā)相關(guān)問(wèn)題必問(wèn)創(chuàng)建線(xiàn)程的種方式。什么是線(xiàn)程安全。盡量少通過(guò)電話(huà)面試,效果不好。通過(guò)面試官可以大概判斷這家公司的情況。 最近3個(gè)月一口氣面了十幾家公司的Java開(kāi)發(fā)崗,大大小小的面試筆試加起來(lái)快20場(chǎng),收獲很多。本人畢業(yè)快2年了,畢業(yè)時(shí)在學(xué)校所在的2線(xiàn)省會(huì)城市找了家開(kāi)發(fā)公司做java的開(kāi)發(fā),前前后后做了1年半,感覺(jué)公司對(duì)技術(shù)沒(méi)有啥追求,做的項(xiàng)目翻來(lái)覆去就是S...

    Dean 評(píng)論0 收藏0
  • java基礎(chǔ)鞏固-泛型基礎(chǔ)知識(shí)整理

    摘要:當(dāng)某個(gè)類(lèi)型變量只在整個(gè)參數(shù)列表的所有參數(shù)和返回值中的一處被應(yīng)用了,那么根據(jù)調(diào)用方法時(shí)該處的實(shí)際應(yīng)用類(lèi)型來(lái)確定。即直接根據(jù)調(diào)用方法時(shí)傳遞的參數(shù)類(lèi)型或返回值來(lái)決定泛型參數(shù)的類(lèi)型。 標(biāo)簽: java [TOC] 本文對(duì)泛型的基本知識(shí)進(jìn)行較為全面的總結(jié),并附上簡(jiǎn)短的代碼實(shí)例,加深記憶。 泛型 將集合中的元素限定為一個(gè)特定的類(lèi)型。 術(shù)語(yǔ) ArrayList -- 泛型類(lèi)型 ArrayLis...

    KoreyLee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<