操作集合的工具类Collections

来源:互联网 发布:中国医药化工网数据库 编辑:程序博客网 时间:2024/05/23 18:52

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

  • 排序操作
    Collections提供了如下几个方法用于对List集合元素进行排序。
// 当参数为正数时,将list集合的后参数个元素“整体”移动到前面,当参数为负数时,将list集合的前参数个元素“整体”移动到后面Collections.rotate(list, 2);// 反转指定列表中元素的顺序。Collections.reverse(list);// 对List集合元素进行随机排序。Collections.shuffle(list);// 根据元素的自然顺序对指定list集合的元素按升序进行排序Collections.sort(list);// 根据指定Comperator产生的顺序对List集合元素进行排序。Collections.sort(list, new Comparator<String>() {    @Override    public int compare(String o1, String o2) {        if (o1.compareTo(o2) > 0) return -1;        return 0;    }});// 将指定List集合中的i处元素和j处元素进行交换。Collections.swap(list, 0, 7);// 当参数为正数时,将list集合的后参数个元素“整体”移动到前面,当参数为负数时,将list集合的前参数个元素“整体”移动到后面Collections.rotate(list, 2);
  • 查找、替换操作
    Collections还提供了如下用于查找、替换集合元素的常用方法。
//使用一个新值"9"替换List对象的所有旧值"5"。Collections.replaceAll(list,"5","9");// 返回指定集合中指定元素的出现次数。Collections.frequency(list,"9");// 根据Comparator指定的顺序,返回给集合中的最小元素。Collections.min(list, new Comparator<String>() {    @Override    public int compare(String o1, String o2) {        if(o1.compareTo(o2) > 0) return -1;        return 0;    }});// 根据元素的自然顺序,返回给集合中的最小元素。Collections.min(list);// 根据Comparator指定的顺序,返回给集合中的最大的元素。Collections.max(list, new Comparator<String>() {    @Override    public int compare(String o1, String o2) {        if(o1.compareTo(o2) > 0) return -1;        return 0;    }});// 根据元素的自然顺序,返回给定集合中的最大元素。Collections.max(list);// 使用二分法搜索指定的List集合,用来获得指定对象key在List集合中的索引。list必须有序Collections.binarySearch(list,"3");// 使用指定元素obj替换指定List集合中的所有元素。Collections.fill(list,"9");
  • 同步控制
      Collections类中提供了多个synchronizedXxx()方法,该方法可以将指定的集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的多线程安全问题。
      Java中常用的集合框架中的实现类,HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap、和TreeMap都是线程不安全的。如果有多个线程访问它们,而且有超过一个的线程试图修改它们,则可能会出现错误。Collections提供了多个静态方法可以把它们包装成线程同步的集合。
Collection<String> collection = Collections.synchronizedCollection(new ArrayList<String>());List<String> list = Collections.synchronizedList(new ArrayList<String>());Set<String> set = Collections.synchronizedSet(new HashSet<String>());Map<String,String> map = Collections.synchronizedMap(new HashMap<String,String>());

通过synchronizedXxx()方法,就可以直接获取List、Set、Map的线程安全实现版本。

  • 设置不可变集合
    Collections提供如下三个类方法来返回一个不可变的集合。
    1.emptyXxx():返回一个空的,不可变的结合对象,此处的集合即可以是List,也可以是Set,还可以是Map。
    2.singletonXxx():返回一个包含指定对象的,不可变的集合对象,此处的集合即可以是List,也可以是Set,还可以是Map。
    3.unmodifiableXxx():返回指定集合对象的不可变视图,此处的集合既可以是List,也可以是Set,还可以是Map。
public static void test5(){    //创建一个空的,不可变的Set对象    Set set = Collections.emptySet();    //创建一个只包含特定对象的List集合    List<String> list = Collections.singletonList("abc");    //创建一个普通的Map集合,将Map集合转变为一个不能在更改的Map对象    Map map = new HashMap();    map.put("123", "abc");    map.put("456", "def");    Map unmodifiableMap =Collections.unmodifiableMap(map);}

源代码:
https://github.com/wolf521/demo/tree/master/src/main/java/com/example/demo/collection