摘要:傳入的構(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);
}
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
摘要:編程思想第版這本書(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í)踐(初...
前言 聲明,本文使用的是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ǔ)言,...
摘要:的長(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...
摘要:當(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...
閱讀 1619·2021-11-11 10:59
閱讀 2624·2021-09-04 16:40
閱讀 3650·2021-09-04 16:40
閱讀 2979·2021-07-30 15:30
閱讀 1615·2021-07-26 22:03
閱讀 3164·2019-08-30 13:20
閱讀 2225·2019-08-29 18:31
閱讀 439·2019-08-29 12:21