操作集合的工具类:Collections

操作集合的工具类: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);   //③
            }
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值