Java Review (三十、集合----- 操作集合的工具类: Collections

@


Java 提供了一个操作 Set 、 List 和 Map等集合的类:Collections , 该工具类里提供了大量方法对集合元素进行排序、 查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法 。

排序操作

Collections 提供了如下常用的类方法用于对 List 集合元素进行排序 。

  • void reverse(List list): 反转指定 List 集合中元素的顺序 。
  • void shuffie(List list): 对 List 集合元素进行随机排序 (shuffie 方法模拟了 "洗牌" sort(List !ist): 根据元素的自然顺序对指定 List 集合的元素按升序进行排序。
  • void sort(List list,Comparator c): 根据指定 Comparator 产生 的顺序对 List 集合元素进行排序 。
  • void swap(List list,int i,int j): 将指定 List 集合中的 i 处元素和 j 处元素进行交换。
  • void rotate(List list,int distance): 当 distance 为正数时,将 list 集合的后 distance 个元素"整体"移到前面;当 distance 为负数时,将 list 集合的前 distance 个元素"整体 "移到后面 。 该方法不会改变集合的长度 。

 下面程序简单示范了利用 Collections 工具类来操作 List 集合:


SortTest.java

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);
		System.out.println(nums); // 输出:[2,-5,3,0]
		Collections.reverse(nums); // 将List集合元素的次序反转
		System.out.println(nums); // 输出:[0,2]
		Collections.sort(nums); // 将List集合元素的按自然顺序排序
		System.out.println(nums); // 输出:[-5,2,3]
		Collections.shuffle(nums); // 将List集合元素的按随机顺序排序
		System.out.println(nums); // 每次输出的次序不固定
	}
}

查找、替换操作

Collections 还提供了如下常用的用于查找、替换集合元素的类万法 。

  • int binarySearch(List list,Object key): 使用 二分搜索法搜索指定的 List 集合 ,以获得指定对象在 List集合中的索引。如果要使该方法可以正常工作,则必须保证 List 中的元素 己经处于有序状态 。
  • Object max(Collection coll): 根据元素 的自然顺序 ,返 回给定集合中的最大元素。
  • Object max(Collection coll,Comparator comp): 根据 Comparator 指定的顺序,返回给定集合中的最大元素 。
  • Object min(Collection coll) : 根据元素的自然顺序,返回给定集合中 的最小元素 。
  • Object min(Collection coll,Comparator comp): 根据 Comparator 指 定的顺序,返回给定集合中的最小元素 。
  • void fill(List list,Object obj): 使用指定元素 obj 替换指定 List 集合中的所有元素 。
  • int frequency(Collection c,Object o): 返回指定集合中指定元素的出现次数。
  • int indexOfSubList(List source,List target) : 返回子 List 对象在父 List 对象中第一次 出现的位置索引:如果父 List 中没有出现这样的子 List,则返回口一 1 。
  • int lastIndexOfSubList(List source,List target): 返回子 List 对象在父 List 对象中最后一 次出现的位置索引 ;如果父 List 中 没有出现这样的子 List,则返回 口 -l 。
  • boolean replaceAll(List list,Object oldVal,Object newVal): 使用一个新值 newVal 替换 List 对象的所有旧值oIdVal 。

 下面程序简单示范了 Collections 工具类的用法 。

SearchTest.java

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);
		System.out.println(nums); // 输出:[2,0]
		System.out.println(Collections.max(nums)); // 输出最大元素,将输出3
		System.out.println(Collections.min(nums)); // 输出最小元素,将输出-5
		Collections.replaceAll(nums,1); // 将nums中的0使用1来代替
		System.out.println(nums); // 输出:[2,1]
		// 判断-5在List集合中出现的次数,返回1
		System.out.println(Collections.frequency(nums,-5));
		Collections.sort(nums); // 对nums集合排序
		System.out.println(nums); // 输出:[-5,1,3]
		//只有排序后的List集合才可用二分法查询,输出3
		System.out.println(Collections.binarySearch(nums,3));
	}
}

同步控制

Collections 类中提供了多个 synchronizedXxxO方法,该方法可以将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。
Java 中 常用的集合框架中的实现类 HashSet 、 TreeSet 、ArrayList 、 ArrayDeque 、 LinkedList 、 HashMap和 TreeMap 都是线程不安全的 。 如果有多个线程访问它们,而且有超过一个的线程试图修改它们,则存在线程安全的问题。 Collections 提供了多个类方法可以把它们包装成线程同步的集合。

 下面的示例程序创建了 4 个线程安全的集合对象:

SynchronizedTest.java

public class SynchronizedTest
{
	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());
	}
}


设置不可变集合

Co llections 提供了如下三类方法来返回一个不可变的集合。

  • emptyXxx(): 返回 一个空的 、 不可变 的集合对象,此处的集合既可以是 List , 也可以 是 SortedSet 、Set , 还可以是 M ap 、 SortedMap 等。
  • singletonXxx() : 返回一个只包含指定对象(只有一个或一项元素)的、不可变的集合对象, 此处的集合既可以是 List,还可以是 Map 。
  • unmodifiableXxx() : 返回指定集合对象的不可变视图,此处的集合既可以是 List ,也可 以 是 Set 、SortedSet , 还可以是 Map 、 SorteMap 等。

上面三类方法的参数是原有的集合对象 , 返回值是该集合的"只读 " 版本 。 通过 Collections 提供的三类方法,可以生成"只读"的 Collection 或 Map。如下 :

UnmodifiableTest.java

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);   //③
	}
}

集合总结

在这里插入图片描述



参考:
【1】:《疯狂Java讲义》
【2】:廖雪峰的官方网站:使用Collections
【3】:微信公众号:Java思维导图

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


@ 注解能被用来为程序元素( 类、 方法、 成员变量等) 设置元数据。 值得指出的是, 注解不影响程序代码的执行, 无论增加、 删除注解, 代码都始终如一地执行。 如果希望让程序中的注解在运行时起一定
@ 1、线性表的概念 线性表是最常见也是最简单的一种数据结构。简言之, 线性表是n个数据元素的有限序列。 其一般描述为: A={a1,a2,……an) 一个数据元素通常包含多个数据项, 此时每个数据元
简介 ArrayList是开发中使用比较多的集合,它不是线程安全的,CopyOnWriteArrayList就是线程安全版本的ArrayList。CopyOnWriteArrayList同样是通过数组
在 Java String类源码阅读笔记 里学习了String类的源码,StringBuilder、StringBuffer是经常拿来和String类做对比的两个类,可谓是“爱恨纠缠” ,这里我们继续
话不多说,先上图。 1、基本概念 欲说线程,必先说进程。 进程:进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程:线程是进程的一个执行路径,一个进程中至少有一个线程,进
@ 网络基础 计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信,因为所有计算机都需要遵循同一种网络协议。 那什么是互联网呢?互联网是网络的网络(internet
JVM是面试中必问的部分,本文通过思维导图以面向面试的角度整理JVM中不可不知的知识。 先上图: 1、JVM基本概念 1.1、JVM是什么 JVM 的全称是 「Java Virtual Machine
@ 本文基于jdk1.8 HashMap采用 key/value 存储结构,每个key对应唯一的value。 在jdk1.7之前,HashMap 的内部存储结构是数组+链表。 在jdk1.8中 Has
@ Eclipse是很多Java开发者的第一个开发工具,尽管开源的Eclipse在一后起之秀的对比下,显得有些颓势,但是,Eclipse有着丰富的插件支持。选择合适的插件,Eclipse表示:老夫也能
@ 准备 LinkedList是基于双向链表数据结构实现的Java集合(jdk1.8以前基于双向循环链表),在阅读源码之前,有必要简单了解一下链表。 先了解一下链表的概念:链表是由一系列非连续的节点组
@ 写博客哪有刷逼乎有意思 1 写博客哪有刷逼乎有意思 2 写博客哪有刷逼乎有意思 3 类的加载、 连接和初始化 系统可能在第一次使用某个类时加载该类, 也可能采用预加载机制来加载某个类。 JVM 和
树结构是一类重要的非线性数据结构。直观来看,树是以分支关系定义的层次结构。树结构在客观世界广泛存在,如人类社会的族谱和各种社会组织机构都可用树来形象表示。 树在计算机领域中也得到广泛应用,尤以二叉树最
@ 本文基于jdk1.8 String类可谓是我们开发中使用最多的一个类了。对于它的了解,仅仅限于API的了解是不够的,必须对它的源码进行一定的学习。 一、前置 String类是Java中非常特别的一
随便打开一个招聘网站,看看对高级Java工程师的技能要求。 抛开其它的经验能力等等,单纯从技术,或者说知识上来讲,可以发现一些共通的地方。 Java基础 计算机基础 数据库,SQL/NoSQL 常用开
@ JDBC指Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。 1、JDBC典型用法 1.1、JDBC 4.2 常用接口和类简介
简介 ArrayList是基于数组实现的一种列表。 ArrayList继承体系如下: 图一:ArrayList继承体系 ArrayList实现了List, RandomAccess, Cloneabl
@ Java 的 IO 通过 java.io 包下的类和接口来支持, 在 java.io 包下主要包括输入、 输出两种 10 流, 每种输入、 输出流又可分为字节流和字符流两大类。 其中字节流以字节为
@ 使用断言 断言(Assertion)是一种调试程序的方式。在Java中,使用assert关键字来实现断言。 断言的概念 假设确信某个属性符合要求, 并且代码的执行依赖于这个属性。例如, 需要计算:
@ Java 程序在不同操作系统上运行时,可能需要取得平台相关的属性,或者调用平台命令来完成特定功能。 Java 提供了 System 类和 Runtime 类来与程序的运行平台进行交互。 Syste
@ Java 提供了一个操作 Set 、 List 和 Map等集合的类:Collections , 该工具类里提供了大量方法对集合元素进行排序、 查询和修改等操作,还提供了将集合对象设置为不可变、对