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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

ArrayList源碼解析(中)

2019-11-10 20:04:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

判斷元素位置

這些函數(shù)都相對(duì)簡(jiǎn)單。因?yàn)榇鎯?chǔ)的元素可能為null,所以判斷的時(shí)候多了一次。

public int size() { return size;}public boolean isEmpty() { return size == 0;}public boolean contains(Object o) { return indexOf(o) >= 0;}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;}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;}

數(shù)組轉(zhuǎn)化

toArray()重載了兩個(gè)方法,其中一個(gè)返回Object[],另外一個(gè)返回指定類(lèi)型的數(shù)組。對(duì)于有參的方法的調(diào)用建議:傳入一個(gè)空的對(duì)象,如 new Integer[]{} 作為參數(shù)。關(guān)于ClassCastException異常:經(jīng)常會(huì)需要將ArrayList里的內(nèi)容轉(zhuǎn)化為特定類(lèi)型的數(shù)組,但是如果使用無(wú)參的toArray()進(jìn)行強(qiáng)制轉(zhuǎn)換,就會(huì)出現(xiàn)ClassCastException異常。此時(shí)需要使用第二個(gè)有參的方法。例如類(lèi)似于: (Integer[]) ArrayList某個(gè)實(shí)例.toArray(new Integer[]{})。在我們使用 T[] toArray(T[] a) 的時(shí)候還需要再一次進(jìn)行顯式的轉(zhuǎn)化,這點(diǎn)有點(diǎn)不懂。因?yàn)檫@個(gè)函數(shù)內(nèi)部已經(jīng)轉(zhuǎn)化了,但是我們還需要 (Integer[]) ArrayList某個(gè)實(shí)例.toArray(new Integer[]{}) 這么寫(xiě),而不是 ArrayList某個(gè)實(shí)例.toArray(new Integer[]{}) 這么寫(xiě)?依舊是有參的那個(gè)函數(shù),如果傳入的參數(shù)的長(zhǎng)度大于size,得到的結(jié)果會(huì)變得沒(méi)有使用意義,正如下面代碼注釋里演示的一樣。public Object clone() { try { @Sup增刪改查// Positional access Operations@SuppressWarnings("unchecked")E elementData(int index) { return (E) elementData[index];}public E get(int index) { rangeCheck(index); return elementData(index);}public E set(int index, E element) { rangeCheck(index); E oldValue = elementData(index); elementData[index] = element; return oldValue;}add操作時(shí)怎么擴(kuò)充容量?調(diào)用ensureCapacityInternal(size + 1) 方法,如果 size+1 < elementData.length,則表示容量充足,不需要擴(kuò)充;如果反之,那么容量擴(kuò)充到原來(lái)的elementData.length 的1.5倍。在進(jìn)行add操作的時(shí)候,都會(huì)嘗試對(duì)elementData擴(kuò)充容量(ensureCapacityInternal()方法),這里有個(gè)提升效率的技巧,詳見(jiàn)ArrayList源碼解析(上)的 “關(guān)于擴(kuò)展容量的相關(guān)操作” 段落。/*** 每次進(jìn)行增加操作的時(shí)候,都會(huì)嘗試擴(kuò)充elementData的容量*/public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true;}public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!! System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++;}public boolean addAll(Collection<? extends E> c) { Object[] a = c.toArray(); int numNew = a.length; ensureCapacityInternal(size + numNew); // Increments modCount System.arraycopy(a, 0, elementData, size, numNew); size += numNew; return numNew != 0;}public boolean addAll(int index, Collection<? extends E> c) { rangeCheckForAdd(index); Object[] a = c.toArray(); int numNew = a.length; ensureCapacityInternal(size + numNew); // Increments modCount int numMoved = size - index; if (numMoved > 0) System.arraycopy(elementData, index, elementData, index + numNew, numMoved); System.arraycopy(a, 0, elementData, index, numNew); size += numNew; return numNew != 0;}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;}public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false;}private void fastRemove(int index) { modCount++; 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}public void clear() { modCount++; // clear to let GC do its work for (int i = 0; i < size; i++) elementData[i] = null; size = 0;}protected void removeRange(int fromIndex, int toIndex) { modCount++; int numMoved = size - toIndex; System.arraycopy(elementData, toIndex, elementData, fromIndex, numMoved); // clear to let GC do its work int newSize = size - (toIndex-fromIndex); for (int i = newSize; i < size; i++) { elementData[i] = null; } size = newSize;}private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}private void rangeCheckForAdd(int index) { if (index > size || index < 0) throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}private String outOfBoundsMsg(int index) { return "Index: "+index+", Size: "+size;}public boolean removeAll(Collection<?> c) { return batchRemove(c, false);}public boolean retainAll(Collection<?> c) { return batchRemove(c, true);}

關(guān)于batchRemove()方法 1. 批量刪除的方法,具體是對(duì)集合c和elementData的交集處理,這里詳細(xì)說(shuō)明一下。

假如集合c和elementData的交集是U,那么,如果complement是true,elementData最終會(huì)只存儲(chǔ)U;如果complement是false,elementData最終刪除U。

2. 在對(duì)elementData的元素進(jìn)行篩選的時(shí)候,這里使用了r、w兩個(gè)游標(biāo),從而避免從新開(kāi)辟一個(gè)新的數(shù)組進(jìn)行存儲(chǔ)。這種方法也是比較常見(jiàn)的一種算法題。

private boolean batchRemove(Collection<?> c, boolean complement) { final Object[] elementData = this.elementData; int r = 0, w = 0; boolean modified = false; try { // 在原有數(shù)組上進(jìn)行篩選的方法,而不是另外開(kāi)辟一個(gè)新的數(shù)組 for (; r < size; r++) if (c.contains(elementData[r]) == complement) elementData[w++] = elementData[r]; } finally { // Preserve behavioral compatibility with AbstractCollection, // even if c.contains() throws. if (r != size) { System.arraycopy(elementData, r, elementData, w, size - r); w += size - r; } if (w != size) { // clear to let GC do its work for (int i = w; i < size; i++) elementData[i] = null; modCount += size - w; size = w; modified = true; } } return modified;}
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
久久久无码中文字幕久...| 久久亚洲综合网| 国产探花在线精品一区二区| 国产综合第一页| 久热精品视频在线观看一区| av电影一区| 成人久久久久久| 深夜成人在线观看| 亚洲国产一区二区三区四区| 黄色片免费在线观看| 国产网红女主播精品视频| wwwww亚洲| 波多野结衣在线网址| 亚洲成人精品综合在线| 亚洲午夜性刺激影院| 亚洲国产激情一区二区三区| 国产精品视频一区麻豆| 国产一区二区91| 人妻内射一区二区在线视频| 99se视频在线观看| 国产欧美二区| 亚洲丝袜精品丝袜在线| 在线电影看在线一区二区三区| 色婷婷综合久久久久久| 99精品视频一区二区三区| 国产一区二区三区在线免费| 亚洲另类一区二区| 亚洲综合在线视频| 久久精品国产亚洲av香蕉| 美女激情福利视频在线观看| 免费观看30秒视频久久| 成人免费xxxxx在线视频| 久久久久久网址| 日韩免费va| 久热中文字幕在线精品免费| 国产av无码专区亚洲av麻豆| 日韩大片在线免费观看| 国产免费不卡av| 成人a在线视频免费观看| 亚洲草久电影| 国产一区二区三区四区尤物| 欧美激情综合网| 永久免费看mv网站入口亚洲| 亚洲尤物视频网| 欧美国产日韩中文字幕在线| 在线综合+亚洲+欧美中文字幕| 手机在线看片1024| 推川ゆうり中文亚洲二区| 亚洲a视频在线| 蜜臀av一级做a爰片久久| 免费a v网站| 欧美激情精品久久久久久黑人| 91麻豆免费在线观看| 中文字幕一区二区人妻痴汉电车| 国产丝袜不卡| 日本在线视频免费| 91久久久久久久久久久久久久| 天天视频一区二区三区| 日本一区二区免费电影| 午夜久久tv| 亚洲美女炮图| 一道本在线免费视频| 欧美综合国产精品久久丁香| 国产精品久久久久精k8| 精品少妇人欧美激情在线观看| 成人国产一区二区三区| 亚洲女人18毛片水真多| 欧美成人乱码一区二区三区| 亚洲av无码一区二区乱子伦| 日韩欧美亚洲区| 日本精品一级二级| 高潮毛片在线观看| 蜜桃精品视频在线观看| 亚洲一区二区三区四区五区午夜| 日韩黄色短视频| 亚洲国产欧美一区二区三区不卡| 今天免费高清在线观看国语| 国产乱淫片视频| 欧美aaaaa成人免费观看视频| 一个人看的日本免费视频| 91免费高清视频| 免费观看的av网站| 337p日本| 91片黄在线观看喷潮| 成人精品免费视频| а√天堂资源在线| 亚洲主播在线观看| 无码人妻aⅴ一区二区三区有奶水| 999久久久免费精品国产| 久久久黄色大片| 丰满的少妇愉情hd高清果冻传媒| 可以在线看的黄色网址| 亚洲免费视频一区二区三区| jizzjizz在线观看| 欧美经典三级视频一区二区三区| 五月激情久久| 不卡的看片网站| 自拍偷拍亚洲视频| 精品国精品自拍自在线| 俄罗斯精品一区二区三区| 琪琪五月天综合婷婷| 欧美一区国产| 91九色国产社区在线观看| 中文字幕专区| 亚洲国产精品999| 丁香色欲久久久久久综合网| 国产日韩精品一区二区三区| 黄色网址三级| 欧美午夜宅男影院| 一区二区三区在线免费视频| 四虎免费av| 欧美一二区视频| 噼里啪啦在线中文观看| 亚洲精品一区二区久| 国产性70yerg老太| 中文在线三区| 四虎免费在线观看视频| 亚洲日本在线观看视频| 日本在线免费网| 福利小视频在线| 日韩av福利在线观看| 麻豆传媒在线播放| 先锋在线亚洲| 亚洲av无码乱码国产精品久久| 国产高清免费视频| 亚洲色图狠狠干| 亚洲精品国产a久久久久久| 国产又爽又黄视频| 久久爱com| 欧美日本啪啪无遮挡网站| 蜜桃一区二区三区在线| 中文字幕日韩av| 2019中文字幕全在线观看| 一二区成人影院电影网| 日韩国产欧美| 婷婷福利视频导航| 欧美激情久久久久| 欧美另类视频| 国产精品久久久久7777按摩| 欧美中文字幕一区二区三区| 先锋在线资源一区二区三区| 免费黄色网网址| 蜜桃传媒视频麻豆一区| 国产网站在线看| 99视频精品免费| 一区二区三区精品牛牛| 成人性教育视频在线观看| 性色国产成人久久久精品| 国产日韩一区二区三区在线| youjizz.com在线观看| 思思99精品视频在线观看| 欧美年轻男男videosbes| 日韩一区二区免费在线电影| 亚洲精品乱码电影在线观看| japanese23hdxxxx日韩| 日韩欧美伦理电影院| 欧美xxxx做受欧美.88| 日本欧美一区二区三区乱码| 久久一区二区三区四区五区| 国产亚洲综合av| 欧美极品欧美精品欧美图片| 亚洲高清999| 四虎永久免费在线观看| www.26天天久久天堂| 国产一级成人av| 91九色极品视频| 日韩另类在线| 成人福利视频在线| 欧美高清视频手机在在线| 欧美最猛性xxxxx(亚洲精品)| 精品人妻伦九区久久aaa片| 日韩免费久久| 久久精品成人av| 日本成人精品| 大菠萝精品导航| 欧美另类网站| 欧美日韩一二三四区| 两个人看的在线视频www| 日本午夜免费一区二区| av网站有哪些| 亚洲精品免费av| 粉嫩喷白浆久久| 影音先锋在线播放| 欧美刺激午夜性久久久久久久| 国产天堂在线观看| 日韩电影一二三区| 秋霞影院午夜丰满少妇在线视频| 久久久久久电影| 欧美特级限制片免费在线观看| 成人国产一区| 欧美系列在线观看| 亚洲天堂网在线观看视频| 老司机午夜精品视频在线观看| 狠狠爱在线视频一区| 久久6免费视频| 亚洲国产精品二十页| 国产亚洲欧美色| 婷婷亚洲成人| 成人黄色小视频在线观看| 红桃视频亚洲| 亚洲女同ⅹxx女同tv| 嫩草伊人久久精品少妇av杨幂| 久久精品视频网| 性一交一乱一区二区洋洋av| 黄网站免费在线| av成人动漫在线观看| 高清在线一区二区| 91免费精品国偷自产在线在线| 97av在线视频免费播放| 欧美精品日本| 精品国产18久久久久久洗澡| 黑人巨大国产9丨视频| 男人天堂a在线| a美女胸又www黄视频久久| 在线看黄网址| 136导航精品福利| 午夜视频在线观看精品中文| 青青草国产成人av片免费| 一本色道久久88| 浓精h攵女乱爱av| 国产精品爽爽久久久久久| 色琪琪久久se色| 免费看欧美黑人毛片| 国产麻豆精品高清在线播放| 日韩在线一区视频| 亚洲精华国产| 波多野结衣乳巨码无在线| 日本欧美一区二区三区不卡视频| 国产精品成人久久久久| www.91在线| 欧美国产日韩a欧美在线观看| 色一情一区二区三区四区| 国产精品久久久久9999赢消| 午夜伦理大片视频在线观看| 欧美精产国品一二三区| 男女视频在线观看| 国产精品午夜在线| 另类av导航| 亚洲欧美在线高清| 99久热这里只有精品视频免费观看| 欧美日韩视频在线一区二区观看视频| 欧美三级电影在线播放| 26uuu久久噜噜噜噜| 国产精彩视频在线观看免费蜜芽| 男人天堂一区二区| h片在线免费观看| 国产精品一区二区三区久久久| 亚洲国产精品黑人久久久| 中文字幕一区日韩电影| 日韩一区二区电影网| 日本三级韩国三级欧美三级| 人妻少妇精品无码专区久久| 日产精品久久久久| 国产美女主播一区| 成人三级av在线| 亚洲国产精品一区二区三区| 午夜不卡影院| 国产免费麻豆视频| 国产真实乱人偷精品视频| 国产在线播放一区| 亚洲精品视频一区二区三区| 精品一区二区三区蜜桃在线| 亚洲人体偷拍| 欧洲杯什么时候开赛| 6—12呦国产精品| 欧美极品一区二区三区| 欧美大交乱xxxx| 久久久久久久久久久久网站| 亚洲线精品久久一区二区三区| 97caopor国产在线视频| 精品亚洲视频在线| 这里只有视频精品| 国产精品欧美大片| 欧美不卡激情三级在线观看| www.九色在线| 日韩精品福利片午夜免费观看| 亚洲欧美国产高清va在线播| 手机成人av在线| 白浆在线视频| 欧美一卡在线观看| 亚洲AV午夜精品| 午夜精品一区二区三区视频免费看| 国模精品一区二区三区色天香| 国产精品欧美综合亚洲| 亚洲涩涩在线观看| 国产精品一香蕉国产线看观看| 日本全棵写真视频在线观看| 天堂网av手机版| 欧美日韩 一区二区三区| 亚洲精品美国一| 亚洲免费伊人电影在线观看av| 不卡一卡2卡3卡4卡精品在| 最新中文字幕在线观看视频| 精品国产免费人成电影在线观...| 亚洲欧美中文字幕在线观看| 俄罗斯毛片基地| 亚洲一区二区三区四区中文| 美女搡bbb又爽又猛又黄www| 欧美第一黄网免费网站| 日韩小视频在线| 午夜在线网站| 精品日韩久久久| 亚洲天堂中文字幕在线| 国产精品毛片久久久| 欧美一二三区| 精品影片一区二区入口| 黄色工厂这里只有精品| 黄色免费网站视频| 日韩片之四级片| av在线不卡播放| 中文字幕一区免费在线观看| 亚洲人和日本人hd| 亚洲大尺度在线观看| 日韩欧美另类中文字幕| 中文字幕欧美国产| 91免费在线视频| 羞羞的网站在线观看| 亚洲成人一区二区在线观看| 亚洲欧美久久| 国产一伦一伦一伦| 在线视频欧美一区| 国产不卡一区二区在线观看| 黄无遮挡免费网站| 亚洲成a人v欧美综合天堂麻豆| 一级黄色片毛片| 欧美性一区二区| 天堂在线视频| 亚洲欧美日韩国产手机在线|