JAVA SE學習筆記(九)Java集合
阿新 • • 發佈:2019-02-01
1 Java集合框架
1.1 概述
Java提供集合類的目的是——為了儲存數量不確定的資料,以及儲存具有對映關係的資料,集合類也被稱為是容器類,處於java.util
包下。集合類和陣列的區別:陣列元素可以是基本型別的值,也可以是物件,而集合裡只能儲存物件。Java的集合類主要是有兩個介面派生而出:Collection
和Map
。
- Java集合分為:
Set
、List
、Queue
、Map
Set
代表無序、不可重複的集合List
代表有序、重複的集合Queue
佇列集合Map
代表具有對映關係的集合,鍵值不可以重複
- 訪問方式:
List
按索引、Map
用key
訪問value
、Set
使用元素本身訪問
1.2 Collection和Iterator介面
1.2.1 Collection介面
Collection
介面是List
、Set
和Queue
介面的父介面,該接口裡定義的方法既可用與操作Set
集合,也可用於操作List
和Queue
集合
- Collection介面定義的方法:
- boolean add(Object o):用於向集合裡新增一個元素
- boolean addAll(Collection c):用於將集合c裡的所有元素新增到指定集合裡
- void clear():清除集合裡的所有元素
- boolean contains(Object o):返回集合裡是否包含指定元素
- boolean containsAll(Collection c):返回集合裡是否包含集合c裡的所有元素
- boolean isEmpty():返回集合是否為空
- Iterator iterator():返回一個Iterator物件,用於遍歷集合裡的元素
- boolean remove(Object o):刪除集合中的指定元素o,當集合中包含了一個或多個元素o時,該方法只刪除第一個符合條件的元素
- boolean removeAll(Collection c):從集合中刪除集合c中的所有的元素,如果刪除了一個或多個元素,則返回true
- boolean retainAll(Collection c):從集合中刪除集合c裡不包含的元素,如果操作刪除了一個或一個以上的元素,則返回true
- int size():返回集合中元素的個數
- Object[] toArray():把集合轉為一個數組
1.2.2 Iterator介面
Iterator
物件主要是用於遍歷Collection
集合中的元素,Iterator
物件也被稱為迭代器
- Iterator介面提供的方法:
- boolean hasNext():如果被迭代的集合元素還沒有被遍歷完,則返回true
- Object next():返回集合裡的下一個元素
- void remove():刪除集合裡上一次next方法返回的元素
- void forEachRemaining(Consumer action):使用Lambda方法來遍歷集合元素
- 注意:當使用
Iterator
對集合元素進行迭代時,Iterator
並不是把集合元素本身傳給了迭代變數,而是把集合元素的值傳給了迭代變數,所以修改迭代變數的值對集合元素本身沒有任何影響。Iterator
迭代器使用的是快速失敗(fail-fast
)機制,一旦在迭代過程中檢測到該集合已經被修改,程式立即引發ConcurrentModificationException
異常,而不是顯示修改後的結果,這樣可以避免共享資源而引發的潛在問題。
1.2.3 遍歷Collection
- 使用Lambda表示式遍歷集合元素
public static void main(String[] args)throws Exception {
Collection books = new HashSet();
books.add("機器學習");
books.add("統計學習方法");
books.add("社群發現");
books.add("大資料時代");
// Methods inherited from interface java.lang.Iterable
books.forEach(obj -> System.out.println(obj));
}
- 使用Iterator遍歷集合元素
public static void main(String[] args)throws Exception {
Collection books = new HashSet();
books.add("機器學習");
books.add("統計學習方法");
books.add("社群發現");
books.add("大資料時代");
Iterator it = books.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
- 使用Lambda表示式遍歷Iterator來遍歷集合元素
public static void main(String[] args)throws Exception {
Collection books = new HashSet();
books.add("機器學習");
books.add("統計學習方法");
books.add("社群發現");
books.add("大資料時代");
Iterator it = books.iterator();
it.forEachRemaining(obj -> System.out.println(obj));
}
- 使用foreach迴圈遍歷集合元素
public static void main(String[] args)throws Exception {
Collection books = new HashSet();
books.add("機器學習");
books.add("統計學習方法");
books.add("社群發現");
books.add("大資料時代");
for(Object obj : books){
System.out.println(obj);
}
}
2 具體的集合
2.1 連結串列(List)
- 在Java中,所有連結串列實際上都是雙向連結的,每個結點存放著指向前驅和後繼結點的引用
- 連結串列是一個有序集合
2.1.1 List介面
List
介面提供的方法:
- void add(int index, Object element):將元素element插入到List集合的index處
- boolean addAll(int index, Collection c):將集合c所包含的所有元素都插入到List集合的index處
- Object get(int index):返回集合index索引處的元素
- int indexOf(Object o):返回物件o在List集合中第一次出現位置的索引
- int lastIndexOf(Object o):返回物件o在List集合中最後一次出現位置的索引
- Object remove(int index):刪除並返回index索引處的元素
- Object set(int index, Object element):將index處的元素替換成element物件,返回被替換的舊元素
- List subList(int fromIndex, int toIndex):返回從索引fromIndex(包含)到索引toIndex(不包含)處所有集合元素組成的子集合
- void replaceAll(UnaryOperator operator):根據operator指定的計算規則重新設定List集合的所有元素
- void sort(Comparator c):根據Comparator引數對List集合的元素排序。
2.1.2 ListIterator介面
ListIterator
介面提供的方法:
- boolean hasPrevious():返回該迭代器關聯的集合是否還有上一個元素
- Object previous():返回該迭代器的上一個元素
- void add(Object o):在當前位置插入一個元素
2.1.3 ArrayList和Vector實現類
- List的兩個典型實現:
ArrayList
和Vector
,基於陣列實現,通常情況下無須考慮ArrayList
和Vector
的initialCapacity
,但是在大批量資料操作時,可以使用ensureCapacity(int minCapacity)
方法一次性地增加initialCapacity
,減少分配次數,提高效能,預設長度為10
- 兩個和長度相關的函式:
- void ensureCapacity(int minCapacity):將
ArrayList
或Vector
集合的Object[]
陣列長度增加大於或等於minCapacity
值 - void trimToSize():調整
ArrayList
或Vector
集合的Object[]
陣列長度為當前元素的個數,呼叫該方法可減少ArrayList
或Vector
集合物件佔用的儲存空間。
- void ensureCapacity(int minCapacity):將
ArrayList
是執行緒不安全的,Vector
是執行緒安全的,但是Vector
的效能較差,不推薦使用Vector
提供一個子類:Stack
,進出棧的元素都是Object,必須進行型別轉換,推薦使用
ArrayDeque`
- Object peek():返回棧的第一個元素
- Object pop():返回棧的第一個元素,並出棧
2.1.4 固定長度的List
- Arrays工具類提供了一個
asList(Object... a)
方法,該方法可以把一個數組或指定個數的物件轉換成一個List集合,這個集合是一個Arrays內部類ArrayList的例項,Arrays.ArrayList是一個固定長度的List集合,程式只能遍歷訪問該集合裡的元素,不可增加、刪除該集合裡的元素
2.1.5 各種線性表的效能分析
- LinkedList集合不僅提供了List的功能,還提供了雙端佇列、棧的功能;
- 綜合性能ArrayList優於LinkedList,在查詢方面ArrayList優於LinkedList,在插入、刪除方面LinkedList優於ArrayList;
- 遍歷集合元素:ArrayLis和Vector推薦使用隨機訪問方法(get),LinkedList推薦使用迭代器遍歷
- 執行插入、刪除操作:推薦使用LinkedList
- 執行緒安全型:使用Collections將集合包裝成執行緒安全的集合。
2.3 集合(Set)
2.3.1 HashSet類
- HashSet是最常用的Set集合,HashSet按Hash演算法來儲存集合中的元素,因此具有很好的存取和查詢效能,HashSet的特點:
- 不能保證元素的排列順序;
- HashSet不是同步的,不是執行緒安全的;
- 集合元素值可以是null。
- HashSet的儲存過程:當向HashSet中存入一個元素的時候,HashSet會呼叫該物件的hashCode()方法來得到該物件的hashCode()值,然後根據該HashCode()值決定該物件在HashSet中的儲存位置。如果有兩個元素通過equals()方法比較返回true,但他們的hashCode()方法返回值不相等,HashSet將會把他們儲存在不同的位置,依然可以新增成功。也就是說HashSet集合判斷兩個元素相等的標準是兩個物件通過equals()方法比較相等,並且兩個物件的hashCode()返回的值也相等。
2.3.2 LinkedHashSet類
- LinkedHashSet也是根據元素的hashCode值來決定元素的儲存位置,但它同時使用連結串列維護元素的次序,也就是說,當遍歷LinkedHashSet的時候,LinkedHashSet將會按照元素的新增順序來訪問集合裡的元素。LinkedHashSet的效能低於HashSet,但在迭代訪問Set裡的全部元素時將有很好的效能。
2.3.3 TreeSet類
- TreeSet是SortedSet介面的實現類,可以確保集合元素處於排序狀態,TreeSet特有的方法:
- Comparator comparator():如果TreeSet採用了訂製排序,則該方法返回定製排序所使用的Comparator,如果TreeSet採用的是自然排序,則返回null
- Object first():返回集合中的第一個元素
- Object last():返回集合中的最後一個元素
- Object lower(Object e):返回集合中位於指定元素之前的元素
- Object higer(Object e):返回集合中位於指定元素之後的元素
- SortedSet subset(Object fromElement, Object toElement):返回此Set的子集,範圍從fromElement(包含)到toElement(不包含)
- SortedSet headset(Object toElement):返回此Set的子集,由小於toElement的元素組成
- SortedSet tailSet(Object fromElement):返回此Set的子集,由大於或等於fromElement的元素組成
- TreeSet採用紅黑樹的資料結構來儲存集合元素,TreeSet支援兩種排序方法:自然排序和訂製排序,預設選擇自然排序。
- 自然排序:升序
- 定製排序:通過Comparator物件或Lambda表示式實現TreeSet的定製排序,不可以在其中新增不同型別的物件。
- Comparable介面:compareTo(Object o)方法,實現大小比較,當為0的時候,表示兩個物件相等,當為正整數的時候,表示前面的大,當為負整數的時候,表示後面的大。實現了Comparable介面的類:
- BigDecimal、BigInteger等數值包裝類:按數值大小比較
- Character:按Unicode值比較
- Boolean:true大於false
- String:按Unicode值比較
- Date、Time:後面的時間大於前面的時間
- 向TreeSet集合中新增元素時,只有第一個元素無須實現Comparable介面,後面新增的所有元素都必須實現Comparable介面。
2.3.4 EnumSet類
- EnumSet是一個專為列舉類設計的集合類,其中的所有元素都必須是指定列舉型別的列舉值,該列舉型別在建立EnumSet時顯式或隱式地指定,且其中的集合元素也是有序的,同列舉類中的順序。EnumSet在內部以位向量的形式儲存,不允許新增null元素。
- EnumSet提供的類方法:
- EnumSet allOf(Class elementType):建立一個包含指定列舉類裡所有列舉值的EnumSet集合
- EnumSet complementOf(EnumSet s):建立一個其元素型別與指定EnumSet裡元素型別相同的EnumSet集合,新EnumSet集合包含原EnumSet集合所不包含的、此列舉類剩下的列舉值
- EnumSet copyOf(Collection c):使用一個普通集合來建立EnumSet集合
- EnumSet copyOf(EnumSet s):建立一個與指定EnumSet具有相同元素型別、相同集合元素的EnumSet集合
- EnumSet noneOf(Class elementType):建立一個元素型別為指定列舉型別的空EnumSet
- EnumSet of(E first, E… rest):建立一個包含一個或多個列舉值的EnumSet集合,傳入的多個列舉值必須屬於同一個列舉類
- EnumSet range(E from, E to):建立一個包含從from列舉值到to列舉值範圍內所有列舉值型別的EnumSet集合
2.3.5 各Set實現類的效能分析
- 常用的是HashSet和TreeSet,但是HashSet的效能總是好於TreeSet,只有需要維護順序的時候,才考慮使用TreeSet,否則都應該使用HasSet;
- LinkedHashSet和HashSet的對比:LinkedHashSet在遍歷查詢方面快,HashSet在插入刪除方面表現出色;
- EnumSet是所有集合中效能最好的,但是缺點是隻能包含同一個列舉類中的列舉值作為集合元素。
- HashSet、TreeSet、EnumSet都是執行緒不安全的。
2.4 佇列(Queue)
佇列:可以讓人們有效地在尾部新增一個元素,在頭部刪除一個元素
2.4.1 Queue集合
- Queue介面提供的方法:
- void add(Object e):將指定元素加入此佇列的尾部
- Object element():獲取佇列頭部的元素,但是不刪除該元素
- boolean offer(Object e):將指定元素加入此佇列的尾部,當使用容量有限的佇列時,效果優於add
- Object peek():獲取佇列頭部元素,單數不刪除該元素,如果佇列為空,則返回null
- Object poll():獲取佇列頭部的元素,並刪除該元素,如果佇列為空,則返回null
- Object remove():獲取佇列頭部的元素,並刪除該元素
2.4.2 PriorityQueue實現類
- PriorityQueue中的元素可以按照任意的順序插入,卻總是按照排序的順序進行檢索
- 優先順序佇列使用了一個優雅且高效的資料結構——堆
2.4.3 Deque介面和ArrayDeque實現類
- Deque介面是Queue介面的子介面,代表一個雙端佇列,Deque介面提供的方法:
- void addFirst(Object e):將指定元素插入該雙端佇列的開頭
- void addLast(Object e) :將指定元素插入該雙端佇列的末尾
- Iterator descendingIterator():返回該雙端佇列對應的迭代器,該迭代器將以逆向順序來迭代佇列中的元素
- Object getFirst():獲取但不刪除雙端佇列的第一個元素
- Object getLast():獲取但不刪除雙端佇列的最後一個元素
- boolean offerFirst(Object e):將指定元素插入該雙端佇列的開頭
- boolean offerLast(Object e) :將指定元素插入該雙端佇列的末尾
- Object peekFirst():獲取但不刪除雙端佇列的第一個元素,如佇列為空,返回null
- Object peekLast():獲取但不刪除雙端佇列的最後一個元素,如佇列為空,返回null
- Object poolFirst():獲取且刪除雙端佇列的第一個元素,如佇列為空,返回null
- Object poolLast():獲取且刪除雙端佇列的最後一個元素,如佇列為空,返回null
- Object pop():pop出該雙端佇列所表示的棧的棧頂元素
- void push(Object e):將一個元素push進該雙端佇列所表示的棧的棧頂
- Object removeFirst():獲取並刪除該雙端佇列的第一個元素
- boolean removeFirstOccurrence(Object o):刪除該雙端佇列的第一次出現的元素o
- Object removeLast():獲取並刪除該雙端佇列的最後一個元素
Queue的方法 | Deque的方法 |
---|---|
add(e)/offer(e) | addLast(e)/offerLast(e) |
remove()/poll() | removeFirst()/pollFirst() |
element()/peek() | getFirst()/peekFirst() |
Stack的方法 | Deque的方法 |
---|---|
push(e) | addFirst(e)/offerFirst(e) |
pop() | removeFirst()/pollFirst() |
peek() | getFirst()/peekFirst() |
- Deque介面提供了一個典型的實現類:ArrayDeque,可以用作“棧”“隊”
3 對映
對映用來存放鍵值對。
3.1 基本對映操作
- Java類庫為對映提供了兩個通用的實現:HashMap和TreeMap,這兩個類都實現了Map介面。HashMap對鍵進行雜湊,TreeMap用鍵的整體順序對元素進行排序,並將其組織成搜尋樹,雜湊或比較函式只能作用於鍵,與鍵關聯的值不能進行雜湊或比較。
- Map介面定義的方法:
- void clear():刪除該Map物件中的所有key-value對
- boolean containsKey(Object key):查詢Map中是否包含指定的key,如果包含則返回true
- boolean containsValue(Object value):查詢Map中是否包含一個或多個value,如果包含則返回true
- Set entrySet():返回Map中包含的key-value對所組成的Set集合,每個集合元素都是Map.Entry物件
- Object get(Object key):返回指定key所對應的value,如果此Map中不包含該key,則返回null
- boolean isEmpty():查詢該Map是否為空,如果為空則返回true
- Set keyset():返回該Map中所有key組成的Set集合
- Object put(Object key, Object value):新增一個key-value對
- void putAll(Map m):將指定Map中的key-value對複製到本Map中
- Object remove(Object key):刪除指定key所對應的key-value對,返回被刪除key所關聯的value,如果該key不存在,則返回null
- boolean remove(Object key, Object value):刪除指定鍵值對
- int size():返回Map中key-value對的個數
- Collection value():返回該Map裡所有value組成的Collection
- Map.Entry類包含的方法:
- Object getKey():返回該Entry裡包含的key值
- Object getValue():返回該Entry裡包含的value值
- Object setValue(V value):設定該Entry裡包含的value值,並返回新設定的value值
- Java 8 為Map新增的方法:
- Object compute(Object key, BiFunction remappingFunction):該方法使用remappingFunction根據原key-value對計算一個新value。只要新value不為null,就是用新value覆蓋原value;如果原value不為null,但新value為null,則刪除原key-value對;如果原value、新value同時為null,則該方法不改變任何key-value對,直接返回null
- Object computeAbsent(Object key, Function mappingFunction):如果傳給該方法的key引數在Map中對應的value為null,則使用mappingFunction根據key計算一個新的結果,如果計算結果不為null,則用計算結果覆蓋原有的value。如果原Map原來不包括該key,那麼該方法可能會新增一組key-value對。
- Object computeIfPresent(Object key, BiFunction remappingFunction):如果傳給該方法的key引數在Map中對應的value不為null,則使用mappingFunction根據key、value計算一個新的結果,如果計算結果不為null,則用計算結果覆蓋原有的value。如果計算結果為null,則刪除原key-value對。
- void forEach(BiConsumer action):遍歷方法
- Object getOrDefault(Object key, V defaultValue):獲取指定key對應的value,如果該key不存在,則返回defaultVaule
- Object merge(Object key, Object key, BiFunction remappingFunction):該方法會先根據key引數獲取該Map中對應的vaule,如果獲取的value為null,則直接用傳入的value覆蓋原有的value;如果獲取的value不為null,則使用remappingFunction函式根據原value、新value計算一個新的結果,並用得到的結果去覆蓋原有的value
- Object putIfAbsent(Object key, Object value):該方法會自動檢測指定key對應的value是否為null,如果該key對應的value為null,該方法將會用新value代替原來的null值
- Object replace(Object key, Object value):將Map中指定key對應的value替換成新value。與傳統put()方法不同的是,該方法不可能新增新的key-value對。如果嘗試替換的key在原Map中不存在,該方法不會新增key-value對,而是返回null。
- boolean replaceAll(K key, V oldValue, V newValue):將Map中指定key-value對的原value替換成新value。如果在Map中找到指定的key-value對,則執行替換並返回true,否則返回false。
- replaceAll(BiFunction function):該方法使用BiFunction對原key-value對執行計算,並將計算結果作為該key-value對的value值
3.2 Java 8 改進的HashMap和Hashtable方法
- HashMap和Hashtable的區別:
- Hashtable是一個執行緒安全的Map實現,但HashMap是執行緒不安全的實現。因此HashMap的效能要優於Hashtable
- Hashtable不允許使用null作為key和value,但是HashMap可以
3.3 LinkedHashMap實現類
- LibkedHashMap使用雙向連結串列來維護key-value對的次序,該列表負責維護Map的迭代順序,迭代順序與key-value對的插入順序保持一致;
- 效能低於HashMap
3.4 使用Properties讀寫屬性檔案
- Properties類可以把Map物件和屬性檔案關聯起來,從而可以把Map物件中的key-value對寫入屬性檔案中,也可以把屬性檔案中的“屬性名=屬性值”載入到Map物件中,Properties裡的key、value都是字串物件
- 方法:
- String getProperty(String key):獲取Properties中指定屬性名對應的屬性值
- String getProperty(String key, String defaultValue):同上一個函式的功能,就是在key不存在的時候返回預設值
- Object setProperty(String key, String value):設定屬性值
- void load(InputStream inStream):從屬性檔案中載入key-value對,把載入到的key-value對追加到Properties裡
- void store(OutputStream out, String comments):將Properties中的key-value對輸出到指定的屬性檔案中
public static void main(String[] args) throws Exception {
Properties props = new Properties();
// 向Properties中增加屬性
props.setProperty("username" , "yeeku");
props.setProperty("password" , "123456");
// 將Properties中的key-value對儲存到a.ini檔案中
props.store(new FileOutputStream("a.ini"), "comment line"); //①
// 新建一個Properties物件
Properties props2 = new Properties();
// 向Properties中增加屬性
props2.setProperty("gender" , "male");
// 將a.ini檔案中的key-value對追加到props2中
props2.load(new FileInputStream("a.ini") ); //②
System.out.println(props2);
props2.loadFromXML(new FileInputStream("b.xml"));
props2.put("time","2016/9/13");
props2.setProperty("name","liuqinyuan");
props2.storeToXML(new FileOutputStream("c.xml"), "劉沁源","UTF-8");
}
3.5 SortedMap介面和TreeMap實現類
- TreeMap是一個紅黑樹資料結構,每個key-value對即作為紅黑樹的一個節點,儲存節點的時候,需要根據key對節點進行排序,採用兩種排序方式:自然排序和定製排序
- TreeMap提供的方法:
- Map.Entry firstEntry():返回該Map中最小key所對應的key-value對,如果該Map為空,則返回null
- Object firstKey():返回該Map中的最小key值,如果該Map為空,則返回null
- Map.Entry lastEntry():返回該Map中最大key所對應的key-value對,如果該Map為空或不存在這樣的key-value對,則返回null
- Object lastKey():返回該Map中最大key值,如果該Map為空或不存在這樣的key-value對,則返回null
- Map.Entry higherEntry(Object key):返回該Map中位於key後一位的key-value對,如果該Map為空,則返回null
- Object higherKey(Object key) :返回該Map中位於key後一位的key值,如果該Map為空或不存在這樣的key-value對,則返回null
- Map.Entry lowerEntry(Object key):返回該Map中位於key前一位的key-value對,如果該Map為空,則返回null
- Object lowerEntry(Object key) :返回該Map中位於key前一位的key值,如果該Map為空或不存在這樣的key-value對,則返回null
- NavigableMap subMap(Object fromKey, boolean fromInclusive, Object toKey, boolean toInclusive):返回該Map的子Map,其key值的範圍是從fromKey到toKey
- SortedMap subMap(Object fromKey, Object toKey) :返回該Map的子Map,其key值的範圍是從fromKey(包括)到toKey(不包括)
- SortedMap tailMap(Object fromKey):返回該Map的子Map,其key值的範圍是大於fromKey(包括)的所有key
- NavigableMap tailMap(Object fromKey, boolean fromInclusive):返回該Map的子Map,其key值的範圍是大於fromKey的所有key
- SortedMap headMap(Object toKey):返回該Map的子Map,其key值的範圍是小與toKey(不包括)的所有key
- NavigableMap headMap(Object toKey, boolean inclusive):返回該Map的子Map,其key值的範圍是小於toKey的所有key
3.6 WeakHashMap實現類
- WeakHashMap的key只保留了對實際物件的弱引用,可能會被垃圾回收機制回收
3.7 IdentityHashMap實現類
- 和HashMap的區別在於判別兩個key相等時的機制,此時的key必須嚴格相等(key1 == key2),而HashMap實現的是equals()方法
3.8 EnumMap實現類
- EnumMap中的所有key都必須是單個列舉類的列舉值,建立EnumMap時必須顯式或隱式指定它對應的列舉類
- Enmu列舉類的特徵:內部以陣列形式儲存,效能高
- 依據key在列舉類中的順序排序
- 不允許使用null做key,但是可以做value
3.9 各Map實現類的效能分析
- HashMap效能優於Hashtable;
- TreeMap通常比HashMap、Hashtable慢;
- TreeMap中的key-value總是處於有序狀態;
- 推薦使用HashMap;
- LinkedHashMap比HashMap慢,可維護新增順序,使用==而非equals判斷相等
- EnumMap的效能最好,但實際key有限制,只能是屬於同一個列舉類
g) 操作集合的工具類:Collections
Collections可以操作Set、List、Map等集合,用於排序、查詢、修改等
3.10 排序
- Collections提供瞭如下方法用於對List集合的排序:
- void reverse(List list):反轉指定List集合元素的順序
- void shuffle(List list):對List集合元素進行隨機排序
- void sort(List list):根據元素的自然順序對指定List集合的元素按升序進行排序
- void sort(List list, Comparator c):根據指定Comparator產生的順序對List集合元素進行排序
- void swap(List list, int i, int j):將指定List集合中的i處元素和j處元素進行交換
- void rotate(List list, int distance):當distance為正數時,將list集合的後distance個元素“整體”移到前面,當distance為負數的時候,將List集合的前distance個元素“整體”移到後面。
3.11 查詢、替換
- Collections提供的查詢、替換集合元素的類方法:
- int binarySearch(List list, Object key):使用二分搜尋法搜尋指定的List集合,以或得指定物件在List集合中的索引,強調List必須處於有序狀態
- Object max(Collection coll):根據元素的自然順序,返回給定集合中的最大元素
- Object max(Collection coll, Comparator comp):根據Comparator指定的順序,返回給定集合中的最大元素
- Object min(Collection coll):根據元素的自然順序,返回給定集合中的最小元素
- Object min(Collection coll, Comparator comp):根據Comparator指定的順序,返回給定集合中的最小元素
- void fill(List list, Object obj):使用指定元素obj替換指定List集合中的最小元素
- int frequency(Collection c, Object o):返回指定集合中指定元素的出現次數
- int indexOfSubList(List source, List target):返回子List物件在父List物件中第一次出現的位置索引,如果沒有,返回-1
- int lastIndexOfSubList(List source, List target):返回子List物件在父List物件中最後一次出現的位置索引,如果沒有,返回-1
- boolean replaceAll(List list, Object oldVal, Object newVal):使用一個新值newVal替換List物件中所有舊值oldVal
3.12 同步控制
- Collections類提供了多個synchronizedXxx()方法,將指定集合包裝成執行緒同步安全的集合。
public static void main(String[] args){
// 下面程式建立了四個執行緒安全的集合物件
Collection c = Collections.synchronizedCollection(new ArrayList());
List list = Collections.synchronizedList(new ArrayList());
Set s = Collections.synchronizedSet(new HashSet());
Map m = Collections.synchronizedMap(new HashMap());
}
3.13 設定不可變集合
- emptyXxx():返回一個空的、不可變的集合,此處的集合既可以是List,也可以是SortedSet、Set、SortedMap、Map等
- singletonXxx():返回一個只包含指定物件的,不可變的集合物件,可以是List或Map
- unmodifiableXxx():返回指定集合物件的不可變檢視,可以使List、Set、SortedSet、Map、SortedMap