操作集合的工具类:Collections
Java提供了一个操作Set、List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序、查询和修改
等操作,还提供了将集合对象设置为不可变
、对集合对象实现同步控制
等方法。
1.1 排序操作
Collections提供了如下几个方法用于对List集合元素进行排序。
- static void reverse(List list):反转指定List集合中元素的顺序。
- static void shuffle(List list):对List集合元素进行随机排序(shuffle方法模拟了“洗牌”动作)。
- static void sort(List list):根据元素的自然顺序对指定List集合的元素按升序进行排序。
- static void sort(List list, Comparator c):根据指定Comparator产生的顺序对List集合元素进行排序。
- static void swap(List list, int i, int j):将指定List集合中的i处元素和j处元素进行交换。
- static void rotate(List list , int distance):当distance为正数时,将list集合的后distance个元素“整体”移到前面;当distance为负数时,将list集合的前distance个元素“整体”移到后面。该方法不会改变集合的长度。
下面程序简单示范了利用Collections工具类来操作List集合。
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);
//输出:[2, -5, 3, 0]
System.out.println(nums);
//将List集合元素的次序反转
Collections.reverse(nums);
//输出:[0, 3, -5, 2]
System.out.println(nums);
//将List集合元素按自然顺序排序
Collections.sort(nums);
//输出:[-5, 0, 2, 3]
System.out.println(nums);
//将List集合元素按随机顺序排序
Collections.shuffle(nums);
//每次输出的次序不固定
System.out.println(nums);
}
}
1.2 查找、替换操作
Collections还提供了如下用于查找、替换集合元素的常用方法。
- static int binarySearch(List list, Object key):使用二分搜索法搜索指定的List集合,以获得指定对象在List集合中的索引。如果要使该方法可以正常工作,则必须保证List中的元素已经处于有序状态。
- static Object max(Collection coll):根据元素的自然顺序,返回给定集合中的最大元素。
- static Object max(Collection coll, Comparator comp):根据Comparator指定的顺序,返回给定集合中的最大元素。
- static Object min(Collection coll):根据元素的自然顺序,返回给定集合中的最小元素。
- static Object min(Collection coll, Comparator comp):根据Comparator指定的顺序,返回给定集合中的最小元素。
- static void fill(List list, Object obj):使用指定元素obj替换指定List集合中的所有元素。
下面程序简单示范了Collections工具类的用法。
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);
//输出:[2, -5, 3, 0]
System.out.println(nums);
//输出最大元素,将输出3
System.out.println(Collections.max(nums));
//输出最小元素,将输出-5
System.out.println(Collections.min(nums));
//将nums中的0使用1来代替
Collections.replaceAll(nums , 0 , 1);
//输出:[2, -5, 3, 1]
System.out.println(nums);
//判断-5 在List集合中出现的次数,返回1
System.out.println(Collections.frequency(nums , -5));
//对nums集合排序
Collections.sort(nums);
//输出:[-5, 1, 2, 3]
System.out.println(nums);
//只有排序后的List集合才可用二分法查询,输出3
System.out.println(Collections.binarySearch(nums , 3));
}
}
1.3 同步控制
Collections类中提供了多个synchronizedXxx()方法,该方法可以将指定集合包装成线程同步的集合,从而可以解决多线程
并发访问集合时的线程安全
问题。
正如前面所介绍的,Java中常用的集合框架中的实现类HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap和TreeMap都是线程不安全的。如果有多个线程访问它们,而且有超过一个的线程试图修改它们,则可能出现错误。
Collections提供了多个静态方法可以把它们包装成线程同步的集合。
下面的示例程序创建了4个同步的集合对象。
public class SynchronizedTest
{
public static void main(String[] args)
{
//下面程序创建了4个同步的集合对象
Collection c=Collections
.synchronizedCollection(new ArrayList());
List list=Collections.synchronizedList(new ArrayList());
Set s=Collections.synchronizedSet(new HashSet());
Map m=Collections.synchronizedMap(new HashMap());
}
}
1.4 设置不可变集合
Collections提供了如下三类方法来返回一个不可变的集合。
- emptyXxx():返回一个空的、不可变的集合对象,此处的集合既可以是List,也可以是Set,还可以是Map。
- singletonXxx():返回一个只包含指定对象(只有一个或一项元素)的、不可变的集合对象,此处的集合既可以是List,也可以是Set,还可以是Map。
- unmodifiableXxx:返回指定集合对象的不可变视图,此处的集合既可以是List,也可以是Set,还可以是Map。上面三类方法的参数是原有的集合对象,返回值是该集合的“只读”版本。
通过Collections提供的三类方法,可以生成“只读”的Collection或Map。看下面程序。
public class UnmodifiableTest
{
public static void main(String[] args)
{
//创建一个空的、不可改变的List对象
List unmodifiableList=Collections.emptyList();
//创建一个只有一个元素,且不可改变的Set对象
Set unmodifiableSet=Collections.singleton("疯狂Java讲义");
//创建一个普通的Map对象
Map scores=new HashMap();
scores.put("语文" , 80);
scores.put("Java" , 82);
//返回普通的Map对象对应的不可变版本
Map unmodifiableMap=Collections.unmodifiableMap(scores);
//下面任意一行代码都将引发UnsupportedOperationException异常
unmodifiableList.add("测试元素"); //①
unmodifiableSet.add("测试元素"); //②
unmodifiableMap.put("语文" , 90); //③
}
}