Iterator類
對(duì) collection 進(jìn)行迭代的迭代器
提供的方法:
hasNext() 如果仍有元素可以迭代,則返回 true。
next() 返回迭代的下一個(gè)元素溢吻。
remove() 從迭代器指向的 collection 中移除迭代器返回的最后一個(gè)元素(可選操作)。
-
代碼示例:
特別注意:
- next()方法和remove()方法不能出現(xiàn)在同一個(gè)代碼塊里,不然會(huì)使集合變得不確定俺夕。
- remove()方法雖然可以直接移除點(diǎn)集合中的元素裳凸,但是如果如要用迭代器遍歷刪除之后的集合元素,必須重新使用.iterator() 再重新獲取迭代器實(shí)例劝贸,不能用刪除時(shí)的迭代器對(duì)象姨谷。
- 如果不用迭代器對(duì)集合進(jìn)行循環(huán)遍歷,是不能直接在循環(huán)中對(duì)集合進(jìn)行增刪操作的映九。
Collection類
該類是層次結(jié)構(gòu)中的根接口梦湘,繼承超級(jí)接口Iterable<E>類。此接口不提供任何直接實(shí)現(xiàn)件甥,提供具體的子接口實(shí)現(xiàn):如List和Set捌议;
- Collection類提供的方法,這些方法適用于它的所有子類引有。
- add(E e) 添加一個(gè)元素瓣颅,如果添加失敗則返回false;
- addAll(Collection(? extends E) c) 添加一個(gè)集合,這里如果被添加的集合中的某些元素已經(jīng)在要填加的集合里了譬正,則不會(huì)重復(fù)添加宫补。
- clear() 清除所有元素;
- contains(Object o) 如果此 collection 包含指定的元素曾我,則返回 true粉怕。
- containsAll(Collection(? extends E) c) 如果此 collection 包含指定 collection 中的所有元素,則返回 true抒巢。
- equals(Object o) 比較此 collection 與指定對(duì)象是否相等贫贝。
- isEmpty() 判斷集合是否為空,是返回true;
- iterator() 返回一個(gè)迭代器虐秦。
- remove(Object o) 從此 collection 中移除指定元素的單個(gè)實(shí)例平酿,如果存在的話(可選操作)。
- removeAll(Collection(? extends E) c) 移除兩個(gè)集合中都包含的元素悦陋。
- retainAll(Collection(? extends E) c) 因保存兩個(gè)集合都包含的元素蜈彼。
- size() 返回集合的元素?cái)?shù)量。
- toArray() 返回包含此 collection 中所有元素的數(shù)組俺驶。
List類
特點(diǎn):
有序幸逆、可重復(fù),可以精準(zhǔn)的控制每一個(gè)元素的位置暮现。
索引的下標(biāo)是從0開始的
特殊的迭代器 ListIterator 允許元素插入和替換还绘,以及雙向訪問,可以從指定位置獲取迭代器栖袋。
在 iterator拍顷、add、remove塘幅、equals 和 hashCode 方法的協(xié)定上加了一些其他約定昔案,超過(guò)了 Collection 接口中指定的約定尿贫。
提供的方法:
add(E e) 在列表的尾部添加一個(gè)元素
add(int index, E e) 在列表的指定位置添加一個(gè)元素
addAll(Collection<? extends E> c) 添加指定 collection 中的所有元素到此列表的結(jié)尾,順序是指定 collection 的迭代器返回這些元素的順序(可選操作)踏揣。
addAll(int index, Collection<? extends E> c) 將指定 collection 中的所有元素都插入到列表中的指定位置庆亡。
get(int index) 獲得列表指定位置上的元素
indexOf(Object o) 返回此列表中第一次出現(xiàn)的指定元素的索引;如果此列表不包含該元素捞稿,則返回 -1又谋。
lastIndexOf(Object o) 返回此列表中最后出現(xiàn)的指定元素的索引;如果列表不包含此元素娱局,則返回 -1彰亥。
listIterator() 返回此列表元素的列表迭代器(按適當(dāng)順序)。
listIterator(int index) 返回列表中元素的列表迭代器(按適當(dāng)順序)铃辖,從列表的指定位置開始剩愧。
remove(Object o)從此列表中移除第一次出現(xiàn)的指定元素(如果存在)(可選操作)。
set(int index, E e) 用指定元素替換列表中指定位置的元素(可選操作)。
subList(int fromIndex, int toIndex)返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之間數(shù)據(jù)組成的集合穴翩。
以上就是List類添加的或者相比Collection類的方法加了特殊限定的方法犬第,有些和Collection類相同的方法歉嗓,這里就沒有列出來(lái)!
ListIterator<E>類
列表迭代器(繼承 Iterator類)背蟆,允許程序員按任一方向遍歷列表、迭代期間修改列表带膀,并獲得迭代器在列表中的當(dāng)前位置。
- 提供的方法:
- add(E e) 將指定的元素插入列表(可選操作)垛叨。該元素直接插入到 next 返回的下一個(gè)元素的前面(如果有),或者 previous 返回的下一個(gè)元素之后(如果有)嗽元;如果列表沒有元素,那么新元素就成為列表中的唯一元素剂癌。
- hasNext() 以正向遍歷列表時(shí),如果列表迭代器有多個(gè)元素佩谷,則返回 true辞做。
- hasPrevious()如果以逆向遍歷列表,列表迭代器有多個(gè)元素寡具,則返回 true。
- nextIndex() 返回對(duì) next 的后續(xù)調(diào)用所返回元素的索引
- previousIndex() 返回對(duì) previous 的后續(xù)調(diào)用所返回元素的索引童叠。
- next() 返回列表中的下一個(gè)元素。
- previous() 返回列表中的前一個(gè)元素厦坛。
- remove() 從列表中移除由 next 或 previous 返回的最后一個(gè)元素(可選操作)五垮。
- set(E e) 用指定元素替換 next 或 previous 返回的最后一個(gè)元素(可選操作)。
代碼效果展示:
-
正向迭代:
-
反向迭代:
特別說(shuō)明:
- 參照 Iterator類 的特別說(shuō)明杜秸。
- 集合本身沒有數(shù)據(jù)放仗,那么hasNext()返回為false。
- ListIterator 沒有當(dāng)前元素撬碟;它的光標(biāo)位置 始終位于調(diào)用 previous() 所返回的元素和調(diào)用 next() 所返回的元素之間诞挨。長(zhǎng)度為 n 的列表的迭代器有 n+1 個(gè)可能的指針位置。
- 反向迭代獲取迭代器的方式實(shí)在指定位置反向獲取迭代器呢蛤,所以獲取的迭代器里的元素就是0,1,2,3,4集合中的前一半元素惶傻,正向則相反;
- 如果采取指定位置的方式獲取迭代器其障,那么之后就一定要同樣采取位置方式獲取迭代器银室,不能再使用.listIterator()的方式獲取励翼;
- 如果要進(jìn)行反向迭代蜈敢,必須要采用listIterator(int index)的方式獲取迭代器,其實(shí)這樣做是為了將迭代器的下標(biāo)移到指定位置汽抚,因?yàn)槟J(rèn)的迭代器的位置是在列表元素的前一個(gè)位置“-1”抓狭,如果不指定迭代器的下標(biāo),那么hasPrevious()返回一定是false殊橙,也就無(wú)法通過(guò)hasPrevious()進(jìn)行遍歷
- 錯(cuò)誤寫法集:
-
不能再循環(huán)next()方法或previous()不能和add()辐宾、remove()、set()方法共存膨蛮。
-
不能再循環(huán)中一直進(jìn)行刪除操作:
-
不能再循環(huán)中一直進(jìn)行添加操作叠纹,不然會(huì)造成內(nèi)存溢出!
-
在一個(gè)迭代器循環(huán)里敞葛,set()方法誉察、add()方法、remove()方法不能共存惹谐。
ArrayList<E>
- 特點(diǎn):
- 底層存儲(chǔ)數(shù)據(jù)采用的是數(shù)組的形式持偏,但是數(shù)組的大小是可變的驼卖,但是變化的細(xì)節(jié)并沒有別指定鸿秆,可以添加空值。
- 實(shí)現(xiàn)了List<E>接口桥胞,并且提供了一些可以操控自身存儲(chǔ)數(shù)據(jù)列表的數(shù)組的大小的方法考婴。
- 此類實(shí)現(xiàn)不是同步的,如果多個(gè)線程同時(shí)訪問一個(gè) ArrayList 實(shí)例沥阱,而其中至少一個(gè)線程從結(jié)構(gòu)上修改了列表,那么它必須 保持外部同步策精。(結(jié)構(gòu)上的修改是指任何添加或刪除一個(gè)或多個(gè)元素的操作奔则,或者顯式調(diào)整底層數(shù)組的大小易茬;僅僅設(shè)置元素的值不是結(jié)構(gòu)上的修改)可以在創(chuàng)建的時(shí)候用Collections.synchronizedList方法將對(duì)象“包裝起來(lái)”抽莱。
List list = Collections.synchronizedList(new ArrayList(...));
- 提供的方法:
- 構(gòu)造方法:
- ArrayList() 構(gòu)造一個(gè)初始化容量為10的空列表
- ArrayList(Collection<? extends E> c) 構(gòu)造一個(gè)包含指定 collection 的元素的列表骄恶,
- ArrayList(int initialCapacity) 構(gòu)造一個(gè)具有指定初始容量的空列表。
- 方法摘要:List接口提供的方法同樣適虐呻,這里就不重復(fù)列出
- clone() 返回此 ArrayList 實(shí)例的淺表副本寞秃。返回類型是Object類型
- ensureCapacity(int minCapacity) 增加列表實(shí)例的數(shù)量大小。
- removeRange(int fromIndex, int toIndex) 移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之間的所有元素朗涩。
- trimToSize() 將此 ArrayList 實(shí)例的容量調(diào)整為列表的當(dāng)前大小绑改。
LinkedList<E>類
- 特點(diǎn):
- List接口的鏈接列表的實(shí)現(xiàn)兄一,允許null元素出革。
- 為列表的結(jié)構(gòu)操作提供了很多的操作方法渡讼,方便插入刪除操作!
- 此類實(shí)現(xiàn)不是同步的硝全,如果多個(gè)線程同時(shí)訪問一個(gè) ArrayList 實(shí)例,而其中至少一個(gè)線程從結(jié)構(gòu)上修改了列表析藕,那么它必須 保持外部同步凳厢。(結(jié)構(gòu)上的修改是指任何添加或刪除一個(gè)或多個(gè)元素的操作,或者顯式調(diào)整底層數(shù)組的大兄文唷遮精;僅僅設(shè)置元素的值不是結(jié)構(gòu)上的修改)可以在創(chuàng)建的時(shí)候用Collections.synchronizedList方法將對(duì)象“包裝起來(lái)”。
List list = Collections.synchronizedList(new ArrayList(...));
方法:
構(gòu)造方法:
LinkedList() 構(gòu)造一個(gè)空的列表
LinkedList() 構(gòu)造一個(gè)包含指定 collection 中的元素的列表准脂。
方法摘要:
addFirst(E e) 在列表的頭部插入指定元素
addLast(E e) 在列表的結(jié)尾插入指定的元素
clone() 返回此 ArrayList 實(shí)例的淺表副本檬洞。返回類型是Object類型
descendingIterator() 返回以逆向順序在此雙端隊(duì)列的元素上進(jìn)行迭代的迭代器。
element() 獲取但不移除此列表的頭(第一個(gè)元素)添怔。
getFrist() 返回此列表的第一個(gè)元素。
getLast() 返回此列表的最后一個(gè)元素砾脑。
listIterator() 返回此列表中的元素的列表迭代器(按適當(dāng)順序)性昭,從列表中指定位置開始。
offer(E e) 將指定元素添加到此列表的結(jié)尾
offerFirst(E e) 在此列表的開頭插入指定的元素汹族。
offerLast(E e) 在此列表末尾插入指定的元素。
peek() 獲取但不移除此列表的頭(第一個(gè)元素)夸政。
peekFirst() 獲取但不移除列表的第一個(gè)元素榴徐,如果列表為空,則返回null坑资;
peekLast() 獲取但不移除此列表的最后一個(gè)元素;如果此列表為空仿便,則返回 null攒巍。
poll() 獲取并移除列表的第一個(gè)元素
pollFirst() 獲取并移除此列表的第一個(gè)元素;如果此列表為空闻坚,則返回 null兢孝。
pollLast() 獲取但不移除此列表的最后一個(gè)元素;如果此列表為空跨蟹,則返回 null。
pop()從此列表所表示的堆棧處彈出一個(gè)元素。等同于removeFirst()威恼,如果列表為空則拋出異常。
push(E e) 將元素推入此列表所表示的堆棧腹备。等同于addFirst(E e)
remove() 獲取并移除此列表的頭(第一個(gè)元素)斤蔓。
removeFirst() 移除并返回此列表的第一個(gè)元素。
removeFirstOccurrence(Object o) 從此列表中移除第一次出現(xiàn)的指定元素(從頭部到尾部遍歷列表時(shí))友驮。
removeLast() 移除并返回此列表的最后一個(gè)元素。
removeLastOccurrence(Object o) 從此列表中移除最后一次出現(xiàn)的指定元素(從頭部到尾部遍歷列表時(shí))卸留。
-
代碼實(shí)例:
ArrayList和LinkedList的區(qū)別:
Type | Get | Iteration |Insert |Remove
----|------|----
ArrayList | 110 | 490 |3790 |8730
LinkedList | 1980 | 220 |110 |110
從上表中可以看到ArrayList善于訪問數(shù)據(jù)耻瑟,不善于插入和刪除,而LinkedList恰恰相反喳整;