亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

陌兮大魔王帶你深入 學習ArrayListA(一)

2019-11-10 17:05:16
字體:
來源:轉載
供稿:網友

前引

ArrayList的重要性就不言而喻了,在此鄙人就不多說了。本文適合新手閱讀,如果是大神來訪,還望能夠幫忙發現小子知識不足之處,不甚感激。

ArrayList是什么?

ArrayList是什么?不就是容器嗎,裝個東西而已!如果你是這樣回答的,那問:它底層到底是什么?你又如何作答?其實這時候,我們就因該深入其源碼來學習了。一看到源碼啊,許多新手肯定都是拒絕的。不外乎兩種原因:1、代碼看不懂,2、注釋比代碼更看不懂。所以,鄙人希望,我能給大家獻點薄力,為大家的知識體系添磚蓋瓦。

ArrayList(JDK1.6)源碼:

其實很多源碼都不難.而ArrayList的源碼同樣如此?,F在就讓我們走進ArrayList的源碼世界(篇幅有限,挑一些常用的來說):進入ArrayList的源碼中,首先看到的是這樣一段代碼
PRivate transient Object[] elementData;
private int size;
protected transient int modCount = 0;(來之父類AbstractList,ArrayList不存在)這個elementData就是用來存放數據的object數組。size是數組的大長度,代表的是ArrayList的所存貯的數據的容量。modCount用來記錄容器被改變的次數(對理解沒什么用,后文不再解釋這個變量)。然后我們看到的是ArrayList的構造器
    public ArrayList(int initialCapacity) {	super();        if (initialCapacity < 0)            throw new IllegalArgumentException("Illegal Capacity: "+                                               initialCapacity);	this.elementData = new Object[initialCapacity];    }
    public ArrayList() {	this(10);    }這段代碼是初始化ArrayList用的。從中我們可以看出,實例ArrayList有兩種方法,而我們不一般不帶參數的時候,ArrayList默認的大小是10.即產生一個容量為10的elementData的object數組。下一段代碼
    public void ensureCapacity(int minCapacity) {	modCount++;	int oldCapacity = elementData.length;	if (minCapacity > oldCapacity) {	    Object oldData[] = elementData;	    int newCapacity = (oldCapacity * 3)/2 + 1;    	    if (newCapacity < minCapacity)		newCapacity = minCapacity;            // minCapacity is usually close to size, so this is a win:            elementData = Arrays.copyOf(elementData, newCapacity);	}    }這一段是為了確保數組可以存放下不停增多的數據,而專門設計的增加數組的長度的方法。從中 可以看出實現思路是:當需要存放數據到elementData數組中去的時候,會傳入minCapcity(表示該數組應存入的總數據量),如果minCapcity大于現在的數組的長度,就產生一個新的數組,容量為以前的1.5倍+1,如果仍然小于,就直接將容量設置為minCapcity。然后再將之前存放在原數組的數據復制到新的數組中去,就實現了整個數組的擴容!看完前置準備的各種方法之后,可以看操作的方法了:size():
    public int size() {	return size;    }size就是elementData的長度。
    public boolean isEmpty() {	return size == 0;    }返回size==0的判斷結果indexOf(Object o):
    public int indexOf(Object o) {	if (o == null) {	    for (int i = 0; i < size; i++)		if (elementData[i]==null)		    return i;	} else {	    for (int i = 0; i < size; i++)		if (o.equals(elementData[i]))		    return i;	}	return -1;    }傳入一個對象,返回其索引。 可以看出這個方法只是將傳入的對象和elementData中的每個元素進行比較,然后再返回其數組下標號。找不到的話,就返回-1。contains(Object o)也只是調用了這個方法而已。lastIndexOf(Object o):
    public int lastIndexOf(Object o) {	if (o == null) {	    for (int i = size-1; i >= 0; i--)		if (elementData[i]==null)		    return i;	} else {	    for (int i = size-1; i >= 0; i--)		if (o.equals(elementData[i]))		    return i;	}	return -1;    }可以看見lastIndexOf方法和indexOf是如此的相似,只是將遍歷方向改變了一下就又多了一個方法,哈哈!get(index):
    public E get(int index) {	RangeCheck(index);	return (E) elementData[index];    }
    private void RangeCheck(int index) {	if (index >= size)	    throw new IndexOutOfBoundsException(		"Index: "+index+", Size: "+size);    }set(index,object)
    public E set(int index, E element) {	RangeCheck(index);	E oldValue = (E) elementData[index];	elementData[index] = element;	return oldValue;    }可以發現很多操作都只是在操作數組而已!畢竟ArrayList就是數組。add(o):
    public boolean add(E e) {	ensureCapacity(size + 1);  // Increments modCount!!	elementData[size++] = e;	return true;    }add方法也是如此,只是此處需要判斷是否要擴容add(index,object):
    public void add(int index, E element) {	if (index > size || index < 0)	    throw new IndexOutOfBoundsException(		"Index: "+index+", Size: "+size);	ensureCapacity(size+1);  // Increments modCount!!	System.arraycopy(elementData, index, elementData, index + 1,			 size - index);	elementData[index] = element;	size++;    }在某個位置插入一個對象,這段代碼難得也就這就話:System.arraycopy(elementData, index, elementData, index + 1, size - index); 其實這句好的意思是:將elementData從其第index和后面的元素,復制到elementData的第index+1和之后的位置,共復制size-index個元素,這樣就是實現了將第index為元素騰空,讓外界傳進來的object占據這個寶座。這也是前面擴容的時候使用的是size+1而不是size的原因(確保數組復制時弄的size+1不會越界)remove(index):
    public E remove(int index) {	RangeCheck(index);	modCount++;	E oldValue = (E) elementData[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	return oldValue;    }可以發現和add是差不多的,而且還不許要考慮擴容的問題。同樣的remove(object)相比起來,就多了一個判斷該對象的index在哪,然后直接調用這個方法就行了。

總結:

看到這里,想必大家對ArrayList也算有一個清晰地認知了。同時也明白了源碼并不是很難,而且觀看源碼可以很好地加深我們對知識的理解,理解到底層。這樣的學習會讓我們的知識變得更加牢靠!由于今天實在是太晚了,所以沒有貼上自定義實現的MyArrayList的代碼(還沒有寫哭),所以今天只能告一段落了,若是大家還覺得不過癮,想對容器有進一步的加深的欲望,希望能夠繼續觀看我的博文。以后的文章我會逐一地對LinkedList,Map,Set,Tree等容器進行源碼的解析,還希望大家能夠多多支持,謝謝大家!如果有什么問題,還希望能夠一起討論,若是有什么不足之處,請一定要告訴我,謝謝大笑
上一篇:codevs1215 迷宮

下一篇:HDU-1969 PIE 二分法

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品中文视频在线| 国产精品美女视频网站| 日本一区二区在线免费播放| 九九热精品在线| 热久久美女精品天天吊色| 欧美激情乱人伦一区| 亚洲aⅴ男人的天堂在线观看| 欧美一乱一性一交一视频| 久久久成人精品视频| 久久久中精品2020中文| 欧美日韩中文字幕日韩欧美| 国产精品日韩在线| 亚洲精品97久久| 欧美日韩国产一中文字不卡| 亚洲精品小视频| 欧美日本高清一区| 日本欧美中文字幕| 国产xxx69麻豆国语对白| 亚洲国产成人在线播放| 亚洲久久久久久久久久久| 国产热re99久久6国产精品| 国产精品户外野外| 久久久久久久久综合| 亚洲qvod图片区电影| 久久成人精品电影| 欧美精品性视频| 国产成人在线精品| 操91在线视频| 国产精品久久久av久久久| 国产成人综合一区二区三区| 中文字幕日韩精品在线| 欧美另类极品videosbestfree| 中文字幕亚洲色图| 欧美日韩国产第一页| 国内精品久久久久久中文字幕| 亚洲欧美制服丝袜| 国产精品高潮呻吟久久av黑人| 欧美日韩国产成人高清视频| 在线不卡国产精品| 国产精品久久婷婷六月丁香| 国产午夜精品全部视频在线播放| 亚洲欧美日韩另类| 韩国三级电影久久久久久| 欧美另类极品videosbest最新版本| 欧美日韩中文字幕综合视频| 亚洲的天堂在线中文字幕| 国产日韩欧美视频| 欧美另类极品videosbestfree| 不卡中文字幕av| 午夜精品久久久久久99热软件| 欧美一区二区三区四区在线| 日韩美女av在线| 茄子视频成人在线| 日韩欧美在线播放| 91亚洲人电影| 欧美综合一区第一页| www.午夜精品| 色综合久综合久久综合久鬼88| 国产成人涩涩涩视频在线观看| 一本大道香蕉久在线播放29| 国产成人精品电影久久久| 色综合久综合久久综合久鬼88| 成人免费xxxxx在线观看| 国产亚洲成av人片在线观看桃| 欧美激情视频一区二区三区不卡| 成人妇女免费播放久久久| 日韩在线激情视频| 久久久久久国产三级电影| 欧美激情精品久久久久| 成人免费在线视频网站| 亚洲国模精品一区| 亚洲另类图片色| 中文字幕在线亚洲| 日本一区二区在线播放| 欧美性xxxxxxxxx| 日本一区二区不卡| 精品国内自产拍在线观看| 久久精品一区中文字幕| 欧美天天综合色影久久精品| 久久影院模特热| 亚洲第一精品福利| 久久99久国产精品黄毛片入口| 8090成年在线看片午夜| 欧美裸身视频免费观看| 亚洲一区二区三区视频播放| 欧美多人乱p欧美4p久久| 亚洲精品电影久久久| 91视频免费在线| 久久琪琪电影院| 亚洲天堂影视av| 欧美日韩综合视频| 91国产在线精品| 黑人巨大精品欧美一区二区| 久久久国产一区二区三区| 91精品国产自产在线老师啪| 亚洲在线视频观看| 欧美最近摘花xxxx摘花| 国产精品一区二区三区在线播放| 国内揄拍国内精品| 国产精品第三页| 成人性生交大片免费看视频直播| 国产精品一区二区3区| 国产精品久久久久久久久影视| 自拍视频国产精品| 亚洲护士老师的毛茸茸最新章节| 久久久久久噜噜噜久久久精品| 日韩欧美aⅴ综合网站发布| 成人黄色av播放免费| 亚洲乱码一区av黑人高潮| 亚洲天堂开心观看| 国产成人综合亚洲| 亚洲毛片在线观看.| 亚洲欧美制服另类日韩| 欧美成人黄色小视频| 亚洲第一视频网| 精品美女国产在线| 欧美激情一级精品国产| 国产精品白丝av嫩草影院| 日本午夜人人精品| 日韩av在线直播| 欧美激情喷水视频| 色婷婷av一区二区三区在线观看| 97精品欧美一区二区三区| 精品国产91久久久久久老师| 日本高清不卡在线| 色诱女教师一区二区三区| 亚洲区在线播放| 国产精品自产拍高潮在线观看| 欧美疯狂性受xxxxx另类| 国产日韩欧美日韩大片| 日韩视频免费在线观看| 国产91色在线免费| 国自产精品手机在线观看视频| 日韩一区av在线| 精品国产欧美成人夜夜嗨| 国产精品久久久久久av福利| 日韩在线播放视频| 国产精品久久久久久久一区探花| 午夜精品久久久久久久白皮肤| 精品毛片三在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲精品视频在线观看视频| 欧美一乱一性一交一视频| 性欧美长视频免费观看不卡| 亚洲女人天堂视频| 亚洲精品视频久久| 91精品国产乱码久久久久久久久| 日韩av网站在线| 国产欧美日韩免费看aⅴ视频| 亚洲免费成人av电影| 亚洲乱码国产乱码精品精| 国产精品高潮呻吟久久av黑人| 欧美成人免费小视频| 热久久视久久精品18亚洲精品| 国产中文字幕亚洲| 国产福利精品视频| 国产精品国产自产拍高清av水多| 色先锋久久影院av| www.日本久久久久com.| 久久在线免费视频| 91精品视频免费看| 中文字幕亚洲在线| 91av成人在线| 成年人精品视频|