第8章 集合工具类:Collections

这一生的挚爱 提交于 2020-02-27 23:43:58

Collections工具类

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

排序操作

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

  • void reverse(List list):反转指定List集合中元素的顺序。
  • void shuffle(List list):对list集合元素进行随机排序(shuffle方法模拟了“洗牌动作”)。
  • 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为负数时,向后移。
public class SortTest{
  public static void main(String[] args){
    ArrayList nums = new ArrayList();
    nums.add(2);
    nums.add(-5);
    nums.add(3);
    nums.add(0);
    System.out.println(nums);
    Collections.reverse(nums);// 反转,直接在原对象上改变
    System.out.println(nums);
    Collections.sort(nums);// 排序
    System.out.println(nums);
    Collections.shuffle(nums);// 打乱
    System.out.println(nums);
  }
}
// 执行结果
[2, -5, 3, 0]
[0, 3, -5, 2]
[-5, 0, 2, 3]
[-5, 3, 2, 0]

查找、替换操作

Collections还提供了如下常用的用于查找、替换集合元素的方法:

  • int binarySearch(List list, Object key):使用二分搜索法搜索指定的List集合,以获得指定对象在List集合中的索引。该方法正常运行的前提是List已经处于有序状态。
  • Object max(Collection coll):根据元素的自然顺序,返回给定集合中的最大元素。
  • Object max(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对象中第一次出现的位置索引;如果父List中没有出现子List,返回-1.
  • Int lastIndexOfSubList(List source, List target):返回List对象在父对象中最后一次出现的位置索引;如果父List中没有出现这样的子List,返回-1.
  • boolean replaceAll(List list, Object oldVal, Object new Val):使用一个新值newVal替换List对象的所有旧值。

应用举例:

public class SearchTest{
  public static void main(String[] args){
    ArrayList nums = new ArrayList();
    nums.add(2);
    nums.add(-5);
    nums.add(3);
    nums.add(0);
    System.out.println(nums);
    System.out.println(Collections.max(nums));// 输出最大元素
    System.out.println(Collections.min(nums));// 输出最小元素
    Collections.replaceAll(nums, 0 , 1);// 替换
    System.out.println(nums);
    System.out.println(Collections.frequency(nums, -5));// 统计元素出现频率
    Collections.sort(nums);// 排序
    System.out.println(nums);
    System.out.println(Collections.binaraySearch(nums, 3));// 二分法查找元素,要先排序
  }
}

运行结果:

[2, -5, 3, 0]
3
-5
[2, -5, 3, 1]
1
[-5, 1, 2, 3]
3

同步控制

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

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

public class SynchronizedTest{
  public static void main(String[] args){
    // 下面程序创建了4个线程安全的集合对象
    Collection c = Collections.synrchronizedCollection(new ArrayList());
    List list = Collections.synchronizedList(new ArrayList());
    Set s = Collections.synchronizedSet(new HashSet());
    Map m = Collections.synchronizedMap(new HashMap());
  }
}
  • 直接将新创建的集合对象传给Collections的synchronizedXxx()方法,这样可以直接获取List、Set和Map的线程安全实现版本。

参考书籍:《疯狂Java讲义 》李刚;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!