• 第十三章《集合》第6节:使用Collections类操作集合


    Java提供了一个操作集合的工具类Collections,这个类中提供了大量方法对集合元素进行排序、查询和修改等操作,此外还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。本小节将详细讲解Collections类的使用。

    13.6.1 使用Collections对集合排序

    Collections类中定义了很多对List集合进行排序的方法,如表13-12所示。

    表13-12 Collections类的排序方法

    方法

    功能

    void sort(List list)

    以升序方式对list的元素进行排序

    void sort(List list, Comparator c)

    以Comparator定义的规则对list元素进行排序

    void reverse(List list)

    反转list中元素的顺序

    void swap(List list, int i, int j)

    将list中的i处元素和j处元素进行交换

    void shuffle(List list)

    对list中元素进行随机排序(如同洗牌)

    void rotate(List list, int distance)

    当distance为正数时,将list的后distance个元素整体移到前面,当distance为负数时,将list的前distance个元素整体移到后面

    下面的【例13_20】展示了Collections类集合排序方法的效果。

    【例13_20 Collections类的集合排序方法】

    Exam13_20.java

    1. import java.util.*;
    2. public class Exam13_20 {
    3.     public static void main(String[] args) {
    4.         ArrayList list = new ArrayList();
    5.         list.add(3);
    6.         list.add(5);
    7.         list.add(2);
    8.         list.add(0);
    9.         list.add(1);
    10.         System.out.println("list的原始状态:"+list);
    11.         //反转list中的元素
    12.         Collections.reverse(list);
    13.         System.out.println("反转后的list:"+list);
    14.         //对list元素进行升序排序
    15.         Collections.sort(list);
    16.         System.out.println("排序后的list:"+list);
    17.         //对list元素随机排序
    18.         Collections.shuffle(list);
    19.         System.out.println("随机排序后的list:"+list);
    20.     }
    21. }

    【例13_20】的运行结果如图13-27所示。

    图13-27【例13_20】运行结果

    13.6.2 使用Collections查找和替换集合元素

    Collections还提供了一些查找和替换集合元素的方法,如表13-13所示。

    表13-13 Collections类查找和替换元素的方法

    方法

    功能

    int binarySearch(List list, T key)

    使用二分搜索法搜索list,以获得key在list中的索引,如果要使该方法可以正常工作,则必须保证list 中的元素已经处于有序状态

    Object max(Collection coll)

    根据元素的自然顺序,返回给定集合中的最大元素

    Object max(Collection coll, Comparator comp)

    根据coll指定的规则,返回给定集合中的最大元素

    Object min(Collection coll)

    根据元素的自然顺序,返回给定集合中的最小元素

    Object min(Collection coll, Comparator comp)

    根据coll指定的规则,返回给定集合中的最小元素

    void fill(List list, T obj)

    使用obj替换list中的所有元素

    int frequency(Collection c, Object o)

    返回list中o的出现次数

    int indexOfSubList(List source, List target)

    返回子List对象在父List对象中第一次出现的位置索引,如果没有子List则返回-1

    int lastIndexOfSubList(List source, List target)

    返回子List对象在父List对象中最后一次出现的位置索引,如果没有子List则返回-1

    boolean replaceAll(List list, T oldVal, T newVal)

    使用newVal替换list中的所有oldVal

    下面的【例13_21】展示了如何使用表13-13所列出的方法完成元素的查找和替换

    【例13_21 Collections类查找和替换元素的方法】

    Exam13_21.java

    1. import java.util.*;
    2. public class Exam13_21 {
    3.     public static void main(String[] args) {
    4.         ArrayList nums = new ArrayList();
    5.         nums.add(2);
    6.         nums.add(-5);
    7.         nums.add(3);
    8.         nums.add(0);
    9.         System.out.println("nums的原始状态:"+nums);
    10.         System.out.println("nums中最大的元素:"+Collections.max (nums));
    11.         System.out.println("nums中最小的元素:"+Collections.min (nums));
    12.         //把nums中的0全部替换为1
    13.         Collections.replaceAll(nums , 0,1);
    14.         System.out.println("nums中的0被替换为1:"+nums);
    15.         System. out.println("nums中-5出现的次数:"+Collections. frequency(nums ,-5));
    16.         //对nums集合排序
    17.         Collections.sort (nums);
    18.         System.out.println("排序后的nums:"+nums);
    19.         System.out.print("排序后nums中元素3的索引:");
    20.         System.out.println(Collections.binarySearch (nums , 3));
    21.     }
    22. }

    【例13_21】的运行结果如图13-28所示。

    图13-28【例13_21】运行结果

    13.6.4 同步控制

    Java语言可以轻松的完成多线程编程。为帮助读者理解线程的概念,此处把线程比喻为一个能够独立完成任务的人,多线程也就是多个人同时完成自己的任务,这些线程在完成自身任务的过程中有可能会操作同一个对象,这样就有可能导致对象的状态出现错误。例如A线程负责向文件中写入“张小明”这个名字,而B线程负责向文件中写入“王敏慧”这个名字,如果A和B同时操作文件,就有可能导致文件中的内容变成“张小王明敏慧”,这样文件的内容就变得“乱七八糟”。为了避免出现这种现象,就必须要求多个线程不能同时操作同一个对象,如果一个对象能够做到不被多个线程同时操作,那么这个对象就是“线程安全”的,线程安全也可以被称为“线程同步”。

    Java集合框架中的HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap和TreeMap都是不是线程安全的。如果有多个线程访问它们,而且有超过一个的线程试图修改它们,则存在线程安全的问题。Collections提供了一系列synchronizedXXX()方法,它们可以把它们包装成线程安全的集合,从而可以解决多线程并发访问集合时的线程安全问题。需要说明:这些被包装过的集合实际上是一种新的集合,而这些新的集合都是Collections所定义的静态内部类。下面的【例13_22】展示了如何使用Collections所提供的方法包装集合对象。

    【例13_22 Collections类包装集合的方法】

    Exam13_22.java

    1. import java.util.*;
    2. public class Exam13_22 {
    3.     public static void main(String[] args) {
    4.         ArrayList arrayList = new ArrayList();
    5.         arrayList.add(1);
    6.         arrayList.add(2);
    7.         arrayList.add(3);
    8.         HashSet hashSet = new HashSet(arrayList);
    9.         HashMap hashMap = new HashMap();
    10.         hashMap.put("张三","13899990000");
    11.         hashMap.put("李四","13688887777");
    12.         List list = Collections.synchronizedList(arrayList);
    13.         Set set = Collections.synchronizedSet(hashSet);
    14.         Map map = Collections.synchronizedMap(hashMap);
    15.         System.out.println("原版ArrayList:"+arrayList);
    16.         System.out.println("被包装过的ArrayList:"+list);
    17.         System.out.println("原版HashSet:"+hashSet);
    18.         System.out.println("被包装过的HashSet:"+set);
    19.         System.out.println("原版HashMap:"+hashMap);
    20.         System.out.println("被包装过的HashMap:"+map);
    21.     }
    22. }

    【例13_22】的运行结果如图13-29所示。

    图13-29【例13_22】运行结果

    从图13-29可以看出:原版集合和包装版集合的元素是完全相同的,但包装版集合都是线程安全的。

    除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

  • 相关阅读:
    面试突击78:@Autowired 和 @Resource 有什么区别?
    14 I/O 设备管理(1)
    VScode配置C语言【详细】
    Nginx配置使用详解
    关于 JavaScript 中 null 的一切
    android安全基础知识学习
    PLGA纳米粒负载环丙沙星Ciprofloxacin-PLGA|甲硝唑修饰PLGA纳米粒PLGA-Metronidazole
    VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对CAD/VRML进行二次开发的简介、案例应用之详细攻略
    【Linux】进程探秘
    pdf怎么转换成jpg图片?收藏这几种方法
  • 原文地址:https://blog.csdn.net/shalimu/article/details/128102973