新手,剛開始寫。如果有沒明白可以在下面評論哦黎休,每天晚上下班回家都會在線。對文章結(jié)構(gòu)和敘述請大家給予批評并且給出建議(最重要的一點)
文章中可點擊的鏈接都是我自己寫的玉凯。
本章主要包括
1 Collection簡介
????1.1 Collection接口
????1.2 AbstractCollection抽象類
2 List簡介
????2.1 List接口
????2.2 AbstractList抽象類
3 Set簡介
????3.1 Set接口
????3.2 AbstractSet抽象類
4 Iterator
5 后續(xù)
-
Collection簡介
首先我們先來看下Collection的類圖
從類圖中就可以看出來Collection在Java中有著舉足輕重的地位势腮。
將類圖放大到Collection的前幾個層次你就會發(fā)現(xiàn),Collection主要有兩個分支:List和Set漫仆。
1.1 Collection接口
Collection是集合的高度抽象捎拯,定義了集合共有的操作
size():int //返回集合中的元素數(shù)量
isEmpty():boolean // 判斷集合是否為空
contains(Object):boolean //判斷集合是否包含此元素
toArray():Object[] //將集合轉(zhuǎn)化為數(shù)組返回
toArray(T[]):T[] //返回指定元素類型的數(shù)組
add(E):boolean //添加元素,返回是否添加成功 E為泛型
remove(Object):boolean //刪除元素盲厌,返回是否刪除成功
containsAll(Colleaction<?>):boolean //是否包含此集合
addAll(Colleaction<? extents E>):boolean //添加集合
removeAll(Colleaction<署照? extents E>):boolean //刪除集合
retainAll(Colleaction<?>):boolean //取集合的交集
clear() //清空集合
/** JDK1.8新增祸泪,以下方法都用default修飾。
* default模糊了抽象類和接口的關(guān)系建芙。用default修飾的方法可以不重寫
* 以下方法和特性另開新章節(jié)
*/
spliterator():Spliterator<E> //返回可分割迭代器,并發(fā)使用.
removeIf(Predicate<? super E>):boolean //指定條件刪除
stream():Stream //返回流没隘,相當(dāng)于高級版的迭代器
parallelStream():Stream //可并行操作的流
containsAll和removeAll的誤區(qū)
containsAll和removeAll不是刪除子集。譬如源Collection是1,2,3待刪除的是1,3禁荸。那么刪除后會為2右蒲。
removeAll和containsAll類似。
取并集的操作
@Test
public void testRetainAll() {
List<Integer> list = Arrays.asList(1, 2, 3);
List<Integer> retain = Arrays.asList(1, 3);
list.retainAll(retain);
list.forEach(System.out::println);
}
結(jié)果為2
請在評論區(qū)回答這里為什么是錯誤的赶熟。
1.2 AbstractCollection抽象類
AbstractCollection是對Collection的一些公用方法進行實現(xiàn)瑰妄。
同時添加了一個常量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
此常量是為了限制數(shù)組的長度防止內(nèi)存溢出
containsAll源碼
for (Object e : c)
if (!contains(e))
return false;
return true;
從此出我們可以看出containAll不是判斷子集,而是判斷是否包含參數(shù)集合的所有元素
- List
List繼承Colleaction,中文叫做列表映砖,元素可以重復(fù)间坐,元素排列有序,線程不安全邑退。
順序不是指排序而是你添加到時候是3,1,2的順序添加眶诈,那么取出來的順序也是3,1,2
2.1 List接口
在Collection原有的操作上添加了以下操作
get(int):E //獲取索引位置的元素
set(int,E):E //在此索引位置將元素設(shè)置為E,也即是替換掉
add(int, E):void //在此索引位置上添加元素E
remove(int):E //刪除指定索引位置上的元素并返回此元素
indexOf(Object):int //返回Object在元素上第一次出現(xiàn)的索引位置
lastIndexOf(Object):int //返回Object在元素上最后一次出現(xiàn)的索引位置
listInterator():ListInterator //返回列表迭代器,可以在迭代器中刪除元素
listInterator(int): //返回指定開始位置的迭代器
subList(int form,int end): //返回List的視圖,從From到end的位置 //在ArrayList一章中會解釋瓜饥,文章發(fā)布后會加一個鏈接
2.2 AbstractList抽象類
AbstractList添加了以下操作和一個變量
removeRange(int from,int end):void //刪除from -- end范圍內(nèi)的元素
private rangeCheckForAdd(int):void //判斷添加的索引位置是否合法。不合法則拋出IndexOutBoundsException異常
private outOfBoundsMsg(int):String //返回異常的信息浴骂,int是非法的索引位置
modCount://變量 記錄修改次數(shù)乓土,當(dāng)modCount不匹配的時候會拋出異常。
當(dāng)然理想很豐滿溯警,在單線程的情況下modCount會及時失效趣苏。但是在多線程的時候由于內(nèi)存不可見性會導(dǎo)致modCount的值不是最新值,因此會導(dǎo)致判斷不準確梯轻。
還有四個內(nèi)部類
Ltr:從左到右的列表迭代器
ListLtr extends Itr Implement ListIterator:可雙向移動的列表迭代器
SubList extends AbstractList:列表試圖
RandomAccessSubList extends SubList:可隨機訪問的列表試圖
3 Set
Set繼承Collection食磕。中文叫做集合,元素不可以重復(fù)喳挑,元素排列是無序彬伦。
無序的含義是插入時的順序和取出的順序不相同,而不是按元素排序伊诵。
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(3);
set.add(2);
set.forEach(System.out::println);
輸出的結(jié)果為1,2,3单绑。自動對元素進行排序。但是不能說它是有序的曹宴。
3.1 Set接口
沒有增加任何操作
3.2 AstractSet抽象類
AbstractSet繼承了AbstractCollection抽象類和Set接口搂橙。沒有增加操作。
- Iterator
Iterator是集合的迭代器笛坦,但是卻有限制只能順序移動区转。
hasNext():boolean //下一個索引位置是否有元素
next():E //返回下一個位置的元素
remove():void //刪除操作苔巨。
/**JDK1.8新增*/
forEachRemaining(Consumer<? super E> action):
remove()源碼
default void remove() {
throw new UnsupportedOperationException("remove");
}
Iterator使用了迭代器模式。
- 后續(xù)
這篇文章會擴展出:迭代器模式废离,Lambda侄泽,ArrayList,SubList厅缺,ListIterator等文章蔬顾。