第十三章《集合》第6节:使用Collections类操作集合
Java提供了一个操作集合的工具类Collections,这个类中提供了大量方法对集合元素进行排序、查询和修改等操作,此外还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。本小节将详细讲解Collections类的使用。
13.6.1使用Collections对集合排序
Collections类中定义了很多对List集合进行排序的方法,如表13-12所示。
表13-12 Collections类的排序方法
方法 | 功能 |
void sort(List | 以升序方式对list的元素进行排序 |
void sort(List | 以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
【例13_20】的运行结果如图13-27所示。
图13-27【例13_20】运行结果
13.6.2使用Collections查找和替换集合元素
Collections还提供了一些查找和替换集合元素的方法,如表13-13所示。
表13-13 Collections类查找和替换元素的方法
方法 | 功能 |
使用二分搜索法搜索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指定的规则,返回给定集合中的最小元素 |
使用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 |
使用newVal替换list中的所有oldVal |
下面的【例13_21】展示了如何使用表13-13所列出的方法完成元素的查找和替换
【例13_21 Collections类查找和替换元素的方法】
Exam13_21.java
【例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
【例13_22】的运行结果如图13-29所示。
图13-29【例13_22】运行结果
从图13-29可以看出:原版集合和包装版集合的元素是完全相同的,但包装版集合都是线程安全的。
本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。