Collections 类是 Java 提供的一个操作 Set、List 和 Map 等集合的工具类。Collections 类提供了许多操作集合的静态方法,借助这些静态方法可以实现集合元素的排序、查找替换和复制等操作,下面介绍 Collections 类中操作集合的常用方法
1.排序操作
排序操作(主要针对List接口相关)
reverse(List list):反转指定List集合中元素的顺序
shuffle(List list):对List中的元素进行随机排序(洗牌)
sort(List list):对List里的元素根据自然升序排序
sort(List list, Comparator c):自定义比较器进行排序
swap(List list, int i, int j):将指定List集合中i处元素和j出元素进行交换
rotate(List list, int distance):将所有元素向右移位指定长度,如果distance等于size那么结果不变
例子:以sort(List list, Comparator c):自定义比较器进行排序为例
public class CollectionTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(4);
list.add(5);
list.add(1);
//自定义比较器
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return -(o1-o2);
}
});
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
//内比较器
Collections.sort(list);
System.out.println(list);
}
}
运行结果:
2.查找和替换
查找和替换(主要针对Collection接口相关)
binarySearch(List list, Object key):使用二分搜索法,以获得指定对象在List中的索引,前提是集合已经排序
max(Collection coll):返回最大元素
max(Collection coll, Comparator comp):根据自定义比较器,返回最大元素
min(Collection coll):返回最小元素
min(Collection coll, Comparator comp):根据自定义比较器,返回最小元素
fill(List list, Object obj):使用指定对象填充
frequency(Collection, Object o):返回指定集合中指定对象出现的次数
replaceAll(List list, Object old, Object new):替换
上述方法都比较简单,自己写代码练习就好了
3.同步控制
Collection类中提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而解决多线程并发访问集合时线程的安 全问题。java中常用的HashSet、ArrayList、HashMap都是线程不安全的,如果多条线程访问他们,而且多于一条的线程试图修改它 们,则可能出错。以下方法直接将新建的集合传给了Collections的synchronizedXxx方法,这样就直接获取它们的线程安全实现版本
Collection c = Collections.synchronizedCollection(new ArrayList());
List list = Collections.synchronizedList(new ArrayList());
Set s = Collections.synchroniezedSet(new HashSet());
Map m = Collections.synchronizedMap(new HashMap())
对于synchronized锁的学习,大家可以看我的多线程博客,有一节专门针对synchronized进行详解
4.设置不可变集合
Collections有三类方法可返回一个不可变集合:
emptyXxx():返回一个空的不可变的集合对象
singletonXxx():返回一个只包含指定对象的,不可变的集合对象。
unmodifiableXxx():返回指定集合对象的不可变视图
举例1:emptyXxx()
public class CollectionTest {
public static void main(String[] args) {
List<Object> list1 = Collections.emptyList();
list1.add(1);
}
}
说明该集合是不可变的的空集合
举例2:singletonXxx()
public class CollectionTest {
public static void main(String[] args) {
List<Object> list1 = Collections.singletonList(0);
//list1.add(1);
Iterator iterator = list1.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
运行结果和上面一样,说明singletonXxx():返回一个只包含指定对象的,不可变的集合对象
举例3:unmodifiableXxx()
public class CollectionTest {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
list1.add(2);
list1.add(9);
list1.add(1);
List<Integer> list2 = Collections.unmodifiableList(list1);
//list2.add(100);//抛异常
System.out.println("list2"+list2);
list1.add(100);
System.out.println("list2"+list2);
}
}
运行结果:
我们看到unmodifiableXxx():返回指定集合对象的不可变视图,当我们给list2中添加元素会报错,但是我们给list1中添加元素时候,当我们再次打印list2,我们会看到list2也会收到list1的影响,说明list1和list2两个引用指向的是同一个对象,那和:unmodifiableXxx():返回指定集合对象的不可变视图 就是相违背的,因为我们可以间接的通过list1改变list2,所以我们需要一个操作,在上述代码中添加一行代码:
List<Integer> list2 = Collections.unmodifiableList(list1);
list1 = null;
就是在我们list2创建出来后,把原来list1置为空