`

java Collections工具类用法

    博客分类:
  • java
 
阅读更多

原文:http://www.cnblogs.com/nayitian/archive/2013/08/20/3269585.html

Collections工具类提供了大量针对Collection/Map的操作,总体可分为四类,都为静态(static)方法:

1. 排序操作(主要针对List接口相关)

  • reverse(List list):反转指定List集合中元素的顺序
  • shuffle(List list):对List中的元素进行随机排序(洗牌)
  • sort(List list):对List里的元素根据自然升序排序
  • sort(List list, Comparator c):自定义比较器进行排序
  • swap(List list, int i, int j):将指定List集合中i处元素和j出元素进行交换
  • rotate(List list, int distance):将所有元素向右移位指定长度,如果distance等于size那么结果不变
复制代码
    public void testSort() {
        System.out.println("原始顺序:" + list);
        
        Collections.reverse(list);
        System.out.println("reverse后顺序:" + list);

        Collections.shuffle(list);
        System.out.println("shuffle后顺序:" + list);
        
        Collections.swap(list, 1, 3);
        System.out.println("swap后顺序:" + list);

        Collections.sort(list);
        System.out.println("sort后顺序:" + list);

        Collections.rotate(list, 1);
        System.out.println("rotate后顺序:" + list);
    }
复制代码

输出

原始顺序:[b张三, d孙六, a李四, e钱七, c赵五]
reverse后顺序:[c赵五, e钱七, a李四, d孙六, b张三]
shuffle后顺序:[b张三, c赵五, d孙六, e钱七, a李四]
swap后顺序:[b张三, e钱七, d孙六, c赵五, a李四]
sort后顺序:[a李四, b张三, c赵五, d孙六, e钱七]
rotate后顺序:[e钱七, a李四, b张三, c赵五, d孙六]

2. 查找和替换(主要针对Collection接口相关)

  • binarySearch(List list, Object key):使用二分搜索法,以获得指定对象在List中的索引,前提是集合已经排序
  • max(Collection coll):返回最大元素
  • max(Collection coll, Comparator comp):根据自定义比较器,返回最大元素
  • min(Collection coll):返回最小元素
  • min(Collection coll, Comparator comp):根据自定义比较器,返回最小元素
  • fill(List list, Object obj):使用指定对象填充
  • frequency(Collection Object o):返回指定集合中指定对象出现的次数
  • replaceAll(List list, Object old, Object new):替换
复制代码
    public void testSearch() {
        System.out.println("给定的list:" + list);
        System.out.println("max:" + Collections.max(list));
        System.out.println("min:" + Collections.min(list));
        System.out.println("frequency:" + Collections.frequency(list, "a李四"));
        Collections.replaceAll(list, "a李四", "aa李四");
        System.out.println("replaceAll之后:" + list);
        
        // 如果binarySearch的对象没有排序的话,搜索结果是不确定的
        System.out.println("binarySearch在sort之前:" + Collections.binarySearch(list, "c赵五"));
        Collections.sort(list);
        // sort之后,结果出来了
        System.out.println("binarySearch在sort之后:" + Collections.binarySearch(list, "c赵五"));

        Collections.fill(list, "A");
        System.out.println("fill:" + list);
    }
复制代码

输出

给定的list:[b张三, d孙六, a李四, e钱七, c赵五]
max:e钱七
min:a李四
frequency:1
replaceAll之后:[b张三, d孙六, aa李四, e钱七, c赵五]
binarySearch在sort之前:-4
binarySearch在sort之后:2
fill:[A, A, A, A, A]

3. 同步控制

Collections工具类中提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而解决多线程并发访问集合时线程的安全问题。HashSet、ArrayList、HashMap都是线程不安全的,如果需要考虑同步,则使用这些方法。这些方法主要有:synchronizedSet、synchronizedSortedSet、synchronizedList、synchronizedMap、synchronizedSortedMap。

特别需要指出的是,在使用迭代方法遍历集合时需要手工同步返回的集合。

复制代码
  Map m = Collections.synchronizedMap(new HashMap());
      ...
  Set s = m.keySet();  // Needn't be in synchronized block
      ...
  synchronized (m) {  // Synchronizing on m, not s!
      Iterator i = s.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }
复制代码

4. 设置不可变集合

Collections有三类方法可返回一个不可变集合:

  1. emptyXxx():返回一个空的不可变的集合对象
  2. singletonXxx():返回一个只包含指定对象的,不可变的集合对象。
  3. unmodifiableXxx():返回指定集合对象的不可变视图
复制代码
    public void testUnmodifiable() {
        System.out.println("给定的list:" + list);
        List<String> unmodList = Collections.unmodifiableList(list);
        
        unmodList.add("再加个试试!"); // 抛出:java.lang.UnsupportedOperationException
        
        // 这一行不会执行了
        System.out.println("新的unmodList:" + unmodList);
    }
复制代码

5. 其它

  1. disjoint(Collection<?> c1, Collection<?> c2) - 如果两个指定 collection 中没有相同的元素,则返回 true
  2. addAll(Collection<? super T> c, T... a) - 一种方便的方式,将所有指定元素添加到指定 collection 中。示范:
    Collections.addAll(flavors, "Peaches 'n Plutonium", "Rocky Racoon");
  3. Comparator<T> reverseOrder(Comparator<T> cmp) - 返回一个比较器,它强行反转指定比较器的顺序。如果指定比较器为 null,则此方法等同于 reverseOrder()(换句话说,它返回一个比较器,该比较器将强行反转实现 Comparable 接口那些对象 collection 上的自然顺序)。
复制代码
public void testOther() {
        List<String> list1 = new ArrayList<String>();
        List<String> list2 = new ArrayList<String>();
        
        // addAll增加变长参数
        Collections.addAll(list1, "大家好", "你好","我也好");
        Collections.addAll(list2, "大家好", "a李四","我也好");
        
        // disjoint检查两个Collection是否的交集
        boolean b1 = Collections.disjoint(list, list1);
        boolean b2 = Collections.disjoint(list, list2);
        System.out.println(b1 + "\t" + b2);
        
        // 利用reverseOrder倒序
        Collections.sort(list1, Collections.reverseOrder());
        System.out.println(list1);
    }
复制代码

输出

true false
[我也好, 大家好, 你好]

6. 完整代码

复制代码
package com.clzhang.sample.collections;

import java.util.*;

import org.junit.Before;
import org.junit.Test;

public class CollectionsTest {
    private List<String> list = new ArrayList<String>();

    @Before
    public void init() {
        // 准备测试数据
        list.add("b张三");
        list.add("d孙六");
        list.add("a李四");
        list.add("e钱七");
        list.add("c赵五");
    }
    
    @Test
    public void testUnmodifiable() {
        System.out.println("给定的list:" + list);
        List<String> unmodList = Collections.unmodifiableList(list);
        
        unmodList.add("再加个试试!"); // 抛出:java.lang.UnsupportedOperationException
        
        // 这一行不会执行了
        System.out.println("新的unmodList:" + unmodList);
    }
    
    @Test
    public void testSort() {
        System.out.println("原始顺序:" + list);
        
        Collections.reverse(list);
        System.out.println("reverse后顺序:" + list);

        Collections.shuffle(list);
        System.out.println("shuffle后顺序:" + list);
        
        Collections.swap(list, 1, 3);
        System.out.println("swap后顺序:" + list);

        Collections.sort(list);
        System.out.println("sort后顺序:" + list);

        Collections.rotate(list, 1);
        System.out.println("rotate后顺序:" + list);
    }
    
    @Test
    public void testSearch() {
        System.out.println("给定的list:" + list);
        System.out.println("max:" + Collections.max(list));
        System.out.println("min:" + Collections.min(list));
        System.out.println("frequency:" + Collections.frequency(list, "a李四"));
        Collections.replaceAll(list, "a李四", "aa李四");
        System.out.println("replaceAll之后:" + list);
        
        // 如果binarySearch的对象没有排序的话,搜索结果是不确定的
        System.out.println("binarySearch在sort之前:" + Collections.binarySearch(list, "c赵五"));
        Collections.sort(list);
        // sort之后,结果出来了
        System.out.println("binarySearch在sort之后:" + Collections.binarySearch(list, "c赵五"));

        Collections.fill(list, "A");
        System.out.println("fill:" + list);
    }
    
    @Test
    public void testOther() {
        List<String> list1 = new ArrayList<String>();
        List<String> list2 = new ArrayList<String>();
        
        // addAll增加变长参数
        Collections.addAll(list1, "大家好", "你好","我也好");
        Collections.addAll(list2, "大家好", "a李四","我也好");
        
        // disjoint检查两个Collection是否的交集
        boolean b1 = Collections.disjoint(list, list1);
        boolean b2 = Collections.disjoint(list, list2);
        System.out.println(b1 + "\t" + b2);
        
        // 利用reverseOrder倒序
        Collections.sort(list1, Collections.reverseOrder());
        System.out.println(list1);
    }
}
复制代码
分享到:
评论

相关推荐

    java工具类集合

    Java工具类集合是Java开发中不可或缺的一部分,它们提供了一系列便捷的方法,帮助开发者高效地处理各种常见任务。在Java中,工具类通常被组织在各种包下,如`java.util`、`java.lang`、`java.io`等。下面将详细介绍...

    559.557.JAVA基础教程_集合-Collections工具类常用方法的测试(559).rar

    Java集合框架是Java编程中不可或缺的部分,而Collections工具类则是这个框架中的一个重要工具,它提供了大量静态方法,用于操作各种集合接口(如List、Set、Queue等)的实例。本教程将深入探讨Collections工具类中的...

    Java常用工具类大全,工作5年精心整理.zip

    "Java常用工具类大全,工作5年精心整理.zip"这个压缩包文件很可能包含了一位有经验的Java开发者在五年工作中积累的各种实用工具类,这些工具类能够极大地提高开发效率,简化代码编写。以下是对可能包含的知识点进行...

    牛逼的java常用工具类

    Java作为一个广泛使用的编程语言,其丰富的工具类库是开发者日常工作中不可或缺的部分。在这个名为"牛逼的java常用工具类"的压缩包中,我们可以期待找到一些由经验丰富的开发者精心设计和优化的工具类,这些工具类能...

    Java Collections.pdf

    #### 六、集合的实用工具类 - **Arrays**:提供静态方法对数组进行操作。 - **Collections**:提供静态方法对集合进行操作。 - **Stream API**:引入于Java 8,提供了流式处理集合的能力。 #### 七、集合的并发访问...

    Java常用工具类

    Java常用工具类是Java开发中不可或缺的一部分,它们提供了一系列便捷的方法,帮助开发者高效地处理各种常见任务。在Java中,最著名的工具类库是`java.util`包,它包含了大量实用类,如集合、日期时间、数学计算、...

    一些java常用的工具类

    在Java编程中,工具类(Utility Classes)是非常重要的组成部分,它们提供了许多通用的功能,以简化开发人员的工作。以下是对"一些java常用的工具类"的详细说明。 首先,工具类通常包含静态方法,这些方法不依赖于...

    java utils 工具类

    JavaUtils工具类是Java开发中常见的一类辅助代码集合,它们通常包含各种静态方法,用于简化常见的编程任务,提高开发效率。这篇博文链接(已提供但无法直接访问)可能详细探讨了JavaUtils工具类的设计原则、常用方法...

    java 常用工具类

    Java工具类是Java编程中非常重要的组成部分,它们提供了一系列预定义的方法,可以帮助开发者高效地处理各种常见任务,而无需从头实现。在Java中,最知名的工具类库是`java.util`包,它包含了大量方便实用的类。下面...

    Apress的《Java Collections》

    Java Collections API是Java平台的核心部分,提供了多种容器类,如List、Set和Map,以及对这些容器进行操作的工具类。通过这个API,开发者可以高效地存储、检索和操作数据,实现数据结构和算法的抽象。 在书中,...

    java常用工具类

    Java作为一个广泛使用的编程语言,提供了丰富的工具类来简化开发工作,极大地提高了开发效率。在Java中,工具类通常是一些静态方法的集合,用于执行特定的任务,而不涉及对象的实例化。以下是对标题和描述中提到的...

    JAVA对象以及数据的工具类

    在Java编程语言中,工具类(Utils)是包含各种实用方法的类,这些方法通常用于执行常见的任务,如类型转换、字符串操作、集合处理等。它们使得代码更加简洁且易于维护,因为它们提供了通用功能的封装,避免了重复...

    java常用工具类整理

    掌握这些工具类及其使用场景,不仅可以提升编程效率,还能降低程序出错的概率,对于成为一名优秀的Java开发者至关重要。在实际编程中,不断学习和积累,理解并灵活运用这些工具,是提升自身技能的重要途径。

    APress - Java Collections

    - 使用`Collections`工具类中的静态方法来进行集合操作,如排序、查找最大/最小元素、反转列表等,这些方法通常比手动实现更高效且更简洁。 - 当处理大型数据集时,避免在循环中直接调用集合方法,而是尽可能将集合...

    Java常用工具类包包含各种常用开发工具

    - `java.util.Collections`是针对集合的工具类,包括排序、反转、查找、集合转换等。 - `java.text.SimpleDateFormat`用于日期和时间的格式化和解析。 - `java.net.URL`和`java.net.HttpURLConnection`处理HTTP...

    java常用开发工具类大全

    在Java编程语言中,工具类(Utility Classes)是程序员日常工作中不可或缺的一部分,它们提供了一系列静态方法,用于执行特定任务或处理特定数据类型。"java常用开发工具类大全"可能包含了一系列这样的工具类,旨在...

    50个左右的JAVA工具类,相对比较全

    3. **集合工具类**:Java的Collections类提供了集合的一些基本操作,而Guava库则提供了更加强大的集合处理功能,如Multimap、Multiset、Immutable集合等。 4. **数学计算工具类**:如Apache Commons Math提供了各种...

Global site tag (gtag.js) - Google Analytics