java提供了一個操作Set、List和Map等集合的工具類:Collections,該工具提供了大量方法對集合元素進(jìn)行排序、查詢和修改等操作,還提供了將集合對象設(shè)置為不可變、對集合對象實(shí)現(xiàn)同步控制等方法。
Collections提供了如下常用的方法用于對List集合元素進(jìn)行排序:
| 方法 | 說明 |
|---|---|
void reverse(List list) | 反轉(zhuǎn)指定列表中元素的順序 |
void shuffle(List list) | 對List集合元素進(jìn)行隨機(jī)排序 |
void sort(List list) | 根據(jù)元素的自然順序?qū)χ付↙ist集合的元素按升序進(jìn)行排序 |
void sort(List list,Comparator c) | 根據(jù)指定Comparator產(chǎn)生的順序?qū)ist集合元素進(jìn)行排序 |
void swap(List list,int i,int j) | 將指定List集合中的i處元素和j處元素進(jìn)行交換 |
void rotate(List list, int distance) | 當(dāng)distance為正數(shù)時,將list集合的后distance個元素“整體”移到前面;當(dāng)distance為負(fù)數(shù)時,將list集合的前distance個元素“整體”移到后面;該方法不會改變集合的長度 |
我們可以對Collections對List的排序操作做如下測試:
Collections還提供了如下常用的用于查找和替換集合元素的方法。
| 方法 | 說明 |
|---|---|
int binarySearch(List list,Object key) | 使用二分搜索法搜索指定的List集合,以獲得指定對象在List集合中的索引。如果要使該方法可以正常工作,則必須保證List中的元素已經(jīng)處于有序狀態(tài) |
Object max(Collection coll) | 根據(jù)元素的自然順序,返回指定集合中的最大元素 |
Object max(Collection coll,Comparator comp) | 根據(jù)Comparator指定的順序,返回給定集合的最大元素 |
Object min(Collection coll) | 根據(jù)元素的自然順序,返回指定集合中的最小元素 |
Object min(Collection coll,Comparator comp) | 根據(jù)Comparator指定的順序,返回給定集合的最小元素 |
void fill(List list,Object obj) | 使用指定元素obj替換指定List集合中的所有元素 |
int frequency(Collection coll,Object obj) | 返回指定集合中指定元素的出現(xiàn)次數(shù) |
int indexOfSubList(List source,List target) | 返回子List對象在父List對象中第一次出現(xiàn)的位置索引,如果父List中沒有出現(xiàn)這樣的子List,則返回-1 |
int lastIndexOfSubList(List source,List target) | 返回子List對象在父List對象中最后一次出現(xiàn)的位置索引,如果父List中沒有出現(xiàn)這樣的子List,則返回-1 |
boolean replaceAll(List list,Object oldVal,Object newVal) | 使用一個新值newVal替換List對象的所有舊值oldVal |
同樣,我們做如下測試:
public class SearchTest { public static void main(String[] args) { ArrayList<Integer> nums = new ArrayList<>(); nums.add(3); nums.add(-9); nums.add(0); nums.add(6); // 原始序列,輸出[3, -9, 0, 6] System.out.println(nums); // 輸出nums中的最大元素,6 System.out.println(Collections.max(nums)); // 輸出nums中的最小元素,-9 System.out.println(Collections.min(nums)); // 將nums中的0替換成1,輸出[3, -9, 1, 6] Collections.replaceAll(nums, 0, 1); System.out.println(nums); // 判斷nums中1出現(xiàn)的次數(shù),輸出1 System.out.println(Collections.frequency(nums,1)); // 將nums排序,然后進(jìn)行二分搜索,搜索數(shù)字3的位置索引 Collections.sort(nums); System.out.println(Collections.binarySearch(nums, 3)); }}Collections類中提供了多個synchronizedXxx()方法,該方法可以將指定集合包裝成線程同步的集合,從而可以解決多線程并發(fā)訪問集合時的線程安全問題。
Java中常用的集合框架中的實(shí)現(xiàn)類HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap和TreeMap都是線程不安全的。如果有多個線程訪問它們,而且有超過一個的線程試圖修改它們,則存在線程安全的問題。Collections提供了多個類方法可以把它們包裝成線程同步的集合。
上面的例子中,直接將新創(chuàng)建的集合對象傳給了Collections的synchronizedXxx()方法,這樣就可以直接獲取List、Set和Map的線程安全的實(shí)現(xiàn)版本。
新聞熱點(diǎn)
疑難解答
圖片精選