Java提供了操作Set、List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序、查询
和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。
== static void reverse(List list):反转指定List集合元素的顺序。
== static void shuffle(List list):对List集合元素进行随机排序
== 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):将指定List集合中i出元素和list.length -1 -i处的元素
进行交换。
== static int binarySearch(List list,Object key):使用二分搜索法搜索指定List集合,以获得指定对象在List
集合中的索引。如果要该方法可以正常工作,必须保证List中的元素已经处于有序状态。
== static Obejct mx(Collection coll):根据元素的自然顺序,返回给定集合中的最大元素。
下面还有很多api就不一一列举出来了。
线程并发访问集合时的线程安全问题。
Java常用的集合框架中推荐使用的三个实现类:HashSet、ArrayList和HashMap都是线程不安全的。如果有多条线程访问
他们,而且有超过一条的线程试图修改它们,则可能出现错误。Collections提供了多个静态方法用于创建同步集合。
下面程序创建了四个同步集合对象:
在上面的程序中,直接将创建的集合对象传给了Collections的synchronizedXxx方法,这样就直接获取List、Set和
Map的线程安全实现版本。
== emptyXxx(): 返回一个空的、不可变的集合对象。此处的集合既可以是List,也可以是Set,还可以是Map。
== singletonXxx():返回一个只包含指定对象(只有一个或一项元素)的、不可变的集合对象,此处的集合既可以是List
,也可以是Set,还可以是Map。
== unmodifiableXxx:返回指定集合对象的不可变视图。此处的集合既可以是List,也可以是Set,还可以是Map。
上面三类方法的参数是原来的集合对象,返回值是该集合的“只读版本”。通过上面Collections提供三类方法,可以生成
“只读”的Collections或Map。 看下面程序:
和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。
排序操作
Collections提供了如下几个方法用于对List集合元素进行排序:== static void reverse(List list):反转指定List集合元素的顺序。
== static void shuffle(List list):对List集合元素进行随机排序
== 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):将指定List集合中i出元素和list.length -1 -i处的元素
进行交换。
下面程序简单示范了利用Collections工具类来操作List集合:
- public class TestSort {
- 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);
- //输出[2, -5, 3, 0]
- //将List集合元素的次序反转
- Collections.reverse(nums);
- System.out.println(nums);
- //输出[0, 3, -5, 2]
- //将List集合元素按自然顺序排序
- Collections.sort(nums);
- System.out.println(nums);
- //输出[-5, 0, 2, 3]
- //将List按照集合元素的按随机顺序排序
- Collections.shuffle(nums);
- System.out.println(nums);
- //输出[2, 0, -5, 3]
- }
- }
查找,替换操作
Collections还提供了如下用于查找、替换集合元素的常用方法。== static int binarySearch(List list,Object key):使用二分搜索法搜索指定List集合,以获得指定对象在List
集合中的索引。如果要该方法可以正常工作,必须保证List中的元素已经处于有序状态。
== static Obejct mx(Collection coll):根据元素的自然顺序,返回给定集合中的最大元素。
下面还有很多api就不一一列举出来了。
同步操作
Collections类中提供了多个synchronizedXxx()方法,该方法返回指定集合对象对应的同步对象,从而可以解决多线程并发访问集合时的线程安全问题。
Java常用的集合框架中推荐使用的三个实现类:HashSet、ArrayList和HashMap都是线程不安全的。如果有多条线程访问
他们,而且有超过一条的线程试图修改它们,则可能出现错误。Collections提供了多个静态方法用于创建同步集合。
下面程序创建了四个同步集合对象:
- public class TestSynchronized {
- public static void main(String[] args) {
- //下面程序创建了四个同步的集合对象
- Collection c = Collections.synchronizedCollection(new ArrayList());
- List list = Collections.synchronizedList(new ArrayList());
- Set set = Collections.synchronizedSet(new HashSet());
- Map map = Collections.synchronizedMap(new HashMap());
- }
- }
在上面的程序中,直接将创建的集合对象传给了Collections的synchronizedXxx方法,这样就直接获取List、Set和
Map的线程安全实现版本。
设置不可变集合
Collections类中提供了如下三类方法来返回一个不可变的集合:== emptyXxx(): 返回一个空的、不可变的集合对象。此处的集合既可以是List,也可以是Set,还可以是Map。
== singletonXxx():返回一个只包含指定对象(只有一个或一项元素)的、不可变的集合对象,此处的集合既可以是List
,也可以是Set,还可以是Map。
== unmodifiableXxx:返回指定集合对象的不可变视图。此处的集合既可以是List,也可以是Set,还可以是Map。
上面三类方法的参数是原来的集合对象,返回值是该集合的“只读版本”。通过上面Collections提供三类方法,可以生成
“只读”的Collections或Map。 看下面程序:
- public class TestUnmodifiable {
- 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("数学", 90);
- //返回一个普通Map对象对应的不可变版本
- Map unmodifiableMap = Collections.unmodifiableMap(scores);
- //下面任何一行代码将引发UnsupportedOperationException异常
- unmodifiableList.add("测试元素");
- unmodifiableSet.add("测试元素");
- unmodifiableMap.put("英语", 100);
- }
- }