Java常用类(五)之集合工具类Collections

前言 

  Java提供了一个操作Set、List和Map等集合的工具类:Collections,该工具类提供了大量方法对集合进行排序、查询和修改等操作,

    还提供了将集合对象置为不可变、对集合对象实现同步控制等方法。

  这个类不需要创建对象,内部提供的都是静态方法。

一、Collectios概述

  api中的介绍:

二、排序操作

2.1、方法

  1)static void reverse(List<?> list):

    反转列表中元素的顺序。

  2)static void shuffle(List<?> list) :

    对List集合元素进行随机排序。

  3) static void sort(List<T> list)

    根据元素的自然顺序 对指定列表按升序进行排序   4)static <T> void sort(List<T> list, Comparator<? super T> c) :

    根据指定比较器产生的顺序对指定列表进行排序。   5)static void swap(List<?> list, int i, int j)

    在指定List的指定位置i,j处交换元素。

  6)static void rotate(List<?> list, int distance)

    当distance为正数时,将List集合的后distance个元素“整体”移到前面;当distance为负数时,将list集合的前distance个元素“整体”移到后边。该方法不会改变集合的长度。

2.2、实例使用排序操作

import java.util.ArrayList;
import java.util.Collections;

public class CollectionsTest {

    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(3);
        list.add(-2);
        list.add(9);
        list.add(5);
        list.add(-1);
        list.add(6);
        //输出:[3, -2, 9, 5, -1, 6]
        System.out.println(list);
        //集合元素的次序反转
        Collections.reverse(list);
        //输出:[6, -1, 5, 9, -2, 3]
        System.out.println(list);
        
        //排序:按照升序排序
        Collections.sort(list);
        //[-2, -1, 3, 5, 6, 9]
        System.out.println(list);
        
        //根据下标进行交换
        Collections.swap(list, 2, 5);
        //输出:[-2, -1, 9, 5, 6, 3]
        System.out.println(list);
        
        /*//随机排序
        Collections.shuffle(list);
        //每次输出的次序不固定
        System.out.println(list);*/
        
        //后两个整体移动到前边
        Collections.rotate(list, 2);
        //输出:[6, 9, -2, -1, 3, 5]
        System.out.println(list);
    }

}

三、查找、替换操作

3.1、方法

  1) static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)

    使用二分搜索法搜索指定列表,以获得指定对象在List集合中的索引。

    注意:此前必须保证List集合中的元素已经处于有序状态。

  2)static Object max(Collection coll)

     根据元素的自然顺序,返回给定collection 的最大元素。

  3)static Object max(Collection coll,Comparator comp):

    根据指定比较器产生的顺序,返回给定 collection 的最大元素。 

  4)static Object min(Collection coll):

    根据元素的自然顺序,返回给定collection 的最小元素。

  5)static Object min(Collection coll,Comparator comp):

    根据指定比较器产生的顺序,返回给定 collection 的最小元素。

  6) static <T> void fill(List<? super T> list, T obj) :

    使用指定元素替换指定列表中的所有元素。   7)static int frequency(Collection<?> c, Object o)

    返回指定 collection 中等于指定对象的出现次数。   8)static int indexOfSubList(List<?> source, List<?> target) :

    返回指定源列表中第一次出现指定目标列表的起始位置;如果没有出现这样的列表,则返回 -1。    9)static int lastIndexOfSubList(List<?> source, List<?> target)

    返回指定源列表中最后一次出现指定目标列表的起始位置;如果没有出现这样的列表,则返回 -1。   10)static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)

    使用一个新值替换List对象的所有旧值oldVal

3.2、实例使用查找、替换操作

import java.util.ArrayList;
import java.util.Collections;

public class CollectionsTest1 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(3);
        list.add(-2);
        list.add(9);
        list.add(5);
        list.add(-1);
        list.add(6);
        //[3, -2, 9, 5, -1, 6]
        System.out.println(list);
        
        //输出最大元素9
        System.out.println(Collections.max(list));
        
        //输出最小元素:-2
        System.out.println(Collections.min(list));
        
        //将list中的-2用1来代替
        System.out.println(Collections.replaceAll(list, -2, 1));
        //[3, 1, 9, 5, -1, 6]
        System.out.println(list);
        
        list.add(9);
        //判断9在集合中出现的次数,返回2
        System.out.println(Collections.frequency(list, 9));
        
        //对集合进行排序
        Collections.sort(list);
        //[-1, 1, 3, 5, 6, 9, 9]
        System.out.println(list);
        //只有排序后的List集合才可用二分法查询,输出2
        System.out.println(Collections.binarySearch(list, 3));
    }
}

四、同步控制

  Collectons提供了多个synchronizedXxx()方法·,该方法可以将指定集合包装成线程同步的集合,从而解决多线程并发访问集合时的线程安全问题。

  正如前面介绍的HashSet,TreeSet,arrayList,LinkedList,HashMap,TreeMap都是线程不安全的。Collections提供了多个静态方法可以把他们包装成线程同步的集合。

4.1、方法

  1)static <T> Collection<T> synchronizedCollection(Collection<T> c)

    返回指定 collection 支持的同步(线程安全的)collection。   2)static <T> List<T> synchronizedList(List<T> list)

    返回指定列表支持的同步(线程安全的)列表。    3)static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)

    返回由指定映射支持的同步(线程安全的)映射。   4)static <T> Set<T> synchronizedSet(Set<T> s)

     返回指定 set 支持的同步(线程安全的)set。

4.2、实例

import java.util.*;
 
public class TestSynchronized
{
    public static void main(String[] args)
    {
        //下面程序创建了四个同步的集合对象
        Collection c = Collections.synchronizedCollection(new ArrayList());
        List list = Collections.synchronizedList(new ArrayList());
        Set s = Collections.synchronizedSet(new HashSet());
        Map m = Collections.synchronizedMap(new HashMap());
    }
} 

五、Collesction设置不可变集合

5.1、方法

  1)emptyXxx()

     返回一个空的、不可变的集合对象,此处的集合既可以是List,也可以是Set,还可以是Map。

  2)singletonXxx():

    返回一个只包含指定对象(只有一个或一个元素)的不可变的集合对象,此处的集合可以是:List,Set,Map。

  3)unmodifiableXxx():

    返回指定集合对象的不可变视图,此处的集合可以是:List,Set,Map。

  上面三类方法的参数是原有的集合对象,返回值是该集合的”只读“版本。

5.2、实例

import java.util.*;
 
public class TestUnmodifiable
{
    public static void main(String[] args)
    {
        //创建一个空的、不可改变的List对象
        List<String> unmodifiableList = Collections.emptyList();
        //unmodifiableList.add("java");  //添加出现异常:java.lang.UnsupportedOperationException
        System.out.println(unmodifiableList);// []
        //创建一个只有一个元素,且不可改变的Set对象
        Set unmodifiableSet = Collections.singleton("Struts2权威指南");//[Struts2权威指南]
        System.out.println(unmodifiableSet);
        //创建一个普通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);
    }
}

六、其他方法

6.1、方法

  1)addAll()方法   

public static <T> boolean addAll(Collection<? super T> c,T... elements)​

    将所有指定元素添加到指定 collection 中。可以分别指定要添加的元素,或者将它们指定为一个数组。此便捷方法的行为与 c.addAll(Arrays.asList(elements)) 的行为是相同的,

    但在大多数实现下,此方法运行起来可能要快得多。 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class CollectionsTest2 {

    public static void main(String[] args) {
        String[] str ={"hello","nihao","say","love"};
        List<String> list1 = Arrays.asList(str);
        ArrayList list2 = new ArrayList();
        list2.addAll(list1);
        System.out.println(list2);
    }

}    

喜欢就点个“推荐”哦! 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏静默虚空的博客

JAVA 设计模式 状态模式

用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 状态模式是一种行为型模式。 结构 ? 图-状态模式结...

24660
来自专栏静默虚空的博客

JAVA 设计模式 外观模式

用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 外观模式是一种结构型...

239100
来自专栏静默虚空的博客

JAVA 设计模式 代理模式

用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问。 代理模式是一种结构型模式。 结构 ? 图-代理模式结构图 Subject :...

198100
来自专栏静默虚空的博客

JAVA 设计模式 命令模式

用途 命令模式 (Command) 将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化; 对请求排队或请求日志,以及支持可撤销的操作。 命令模...

22660
来自专栏静默虚空的博客

JAVA 设计模式 职责链模式

用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 将这个对象连...

200100
来自专栏静默虚空的博客

JAVA 设计模式 观察者模式

用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。 这个主题对象在状态发生变化时,会通知所...

22570
来自专栏静默虚空的博客

JAVA 设计模式 装饰者模式

用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。 装饰者模式是一种结...

20680
来自专栏静默虚空的博客

JAVA 设计模式 迭代器模式

用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 迭代器模式是一种行为型模式。 结构 ? ...

21150
来自专栏静默虚空的博客

jQuery Ajax

AJAX简介 AJAX 是与服务器交换数据的技术,它在不重载全部页面的情况下,实现了对部分网页的更新。 AJAX = 异步 JavaScript 和 XML(...

239100
来自专栏静默虚空的博客

JAVA 设计模式 解释器模式

用途 解释器模式 (Interpreter) 定义一个语言,定义它的文法的一种表示。 并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 解释器模式...

24390

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励