Java集合框架之Collections工具类

时间:2023-02-24 23:20:56

Java提供了一个操作SetListMap等集合的工具类:Collections,该工具提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。

1.Collections之排序操作

Collections提供了如下常用的方法用于对List集合元素进行排序:

方法 说明
void reverse(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个元素“整体”移到后面;该方法不会改变集合的长度

我们可以对CollectionsList的排序操作做如下测试:

public class SortTest {
public static void main(String[] args) {
ArrayList<Integer> nums = new ArrayList<>();
nums.add(3);
nums.add(-9);
nums.add(0);
nums.add(6);
// 原始list,输出[3, -9, 0, 6]
System.out.println(nums);

// 将nums反转,输出[6, 0, -9, 3]
Collections.reverse(nums);
System.out.println(nums);

// 将nums集合按自然顺序排序,输出[-9, 0, 3, 6]
Collections.sort(nums);
System.out.println(nums);

// 将nums随机打乱
Collections.shuffle(nums);
System.out.println(nums);

// 将nums集合按降序排列,输出[6, 3, 0, -9]
Collections.sort(nums, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
System.out.println(nums);

// 将nums集合的最后两个元素移到最前面,输出[0, -9, 6, 3]
Collections.rotate(nums, 2);
System.out.println(nums);

// 将nums集合的第一个元素移到最后面,输出[-9, 6, 3, 0]
Collections.rotate(nums, -1);
System.out.println(nums);
}
}

2.Collections之查找、替换操作

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 coll,Object obj) 返回指定集合中指定元素的出现次数
int indexOfSubList(List source,List target) 返回子List对象在父List对象中第一次出现的位置索引,如果父List中没有出现这样的子List,则返回-1
int lastIndexOfSubList(List source,List target) 返回子List对象在父List对象中最后一次出现的位置索引,如果父List中没有出现这样的子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出现的次数,输出1
System.out.println(Collections.frequency(nums,1));

// 将nums排序,然后进行二分搜索,搜索数字3的位置索引
Collections.sort(nums);
System.out.println(Collections.binarySearch(nums, 3));
}
}

3.Collections之同步控制

Collections类中提供了多个synchronizedXxx()方法,该方法可以将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。

Java中常用的集合框架中的实现类HashSetTreeSetArrayListArrayDequeLinkedListHashMapTreeMap都是线程不安全的。如果有多个线程访问它们,而且有超过一个的线程试图修改它们,则存在线程安全的问题。Collections提供了多个类方法可以把它们包装成线程同步的集合。

public class SynchronizedTest {

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<>());
}
}

上面的例子中,直接将新创建的集合对象传给了CollectionssynchronizedXxx()方法,这样就可以直接获取ListSetMap的线程安全的实现版本。