java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

一、源码解析

1、不可实例化

     private Collections() {}

Collections是util包中一个不可实例化的类。

2、优化参数

    private static final int BINARYSEARCH_THRESHOLD   = 5000;private static final int REVERSE_THRESHOLD        =   18;private static final int SHUFFLE_THRESHOLD        =    5;private static final int FILL_THRESHOLD           =   25;private static final int ROTATE_THRESHOLD         =  100;private static final int COPY_THRESHOLD           =   10;private static final int REPLACEALL_THRESHOLD     =   11;private static final int INDEXOFSUBLIST_THRESHOLD =   35;

Collecions定义的这些变量叫做优化参数(Tuning Parameter),其作用在于优化类中方法的性能(permformance)。

3、排序函数sort()

3.1、根据元素的自然顺序对指定列表按升序进行排序
    @SuppressWarnings("unchecked")public static <T extends Comparable<? super T>> void sort(List<T> list) {list.sort(null);}

参数:要排序的列表。

3.2、根据指定比较器产生的顺序对指定列表进行排序。此列表内的所有元素都必须可使用指定比较器相互比较。
    @SuppressWarnings({"unchecked", "rawtypes"})public static <T> void sort(List<T> list, Comparator<? super T> c) {list.sort(c);}

参数:list-要排序的列表;c-确定列表顺序的比较器。

3.3、关于list.sort方法
List.sort是JDK在1.8增加的方法
@SuppressWarnings({"unchecked", "rawtypes"})default void sort(Comparator<? super E> c) {Object[] a = this.toArray();Arrays.sort(a, (Comparator) c);ListIterator<E> i = this.listIterator();for (Object e : a) {i.next();i.set((E) e);}}

首先,传入一个比较器作为参数,然后就是将list转换成一个数组,再对这个数组进行排序,排序完之后,再利用iterator重新改变list。

4、二分查找方法binarySearch()

Collection中binarySearch及其相关的方法有很多,这里只选两个有代表性的

4.1、使用二分搜索法搜索指定列表,以获得指定对象,在进行此方法调用前比较要将列表元素按照升序排序,否则结果不确定,此方法会执行O(n)次链接遍历和O(log n)次元素比较。
    public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) {if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)return Collections.indexedBinarySearch(list, key);elsereturn Collections.iteratorBinarySearch(list, key);}

参数: list-要搜索的链表,key-要搜索的键。

4.2、根据指定的比较器对列表进行升序排序。
    public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {if (c==null)return binarySearch((List<? extends Comparable<? super T>>) list, key);if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)return Collections.indexedBinarySearch(list, key, c);elsereturn Collections.iteratorBinarySearch(list, key, c);}

参数:list-要搜索的列表,key-要搜索的键,c-排序列表的比较器。

5、反转方法reverse()

转指定列表中元素的顺序,此方法以线性时间运行。

@SuppressWarnings({"rawtypes", "unchecked"})
public static void reverse(List<?> list) {int size = list.size();if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)swap(list, i, j);} else {// instead of using a raw type here, it's possible to capture// the wildcard but it will require a call to a supplementary// private methodListIterator fwd = list.listIterator();ListIterator rev = list.listIterator(size);for (int i=0, mid=list.size()>>1; i<mid; i++) {Object tmp = fwd.next();fwd.set(rev.previous());rev.set(tmp);}}
}

​ 参数:list-元素要被反转的列表

6、改组方法shuffle()

6.1、用默认随机源对指定列表进行置换,所有置换发生的可能性都是大致相等的
    public static void shuffle(List<?> list) {Random rnd = r;if (rnd == null)r = rnd = new Random(); // harmless race.shuffle(list, rnd);}

参数:list-要改组的列表

6.2、用指定的随机源对指定列表进行置换
@SuppressWarnings({"rawtypes", "unchecked"})
public static void shuffle(List<?> list, Random rnd) {int size = list.size();if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {for (int i=size; i>1; i--)swap(list, i-1, rnd.nextInt(i));} else {Object[] arr = list.toArray();// Shuffle arrayfor (int i=size; i>1; i--)swap(arr, i-1, rnd.nextInt(i));// Dump array back into list// instead of using a raw type here, it's possible to capture// the wildcard but it will require a call to a supplementary// private methodListIterator it = list.listIterator();for (int i=0; i<arr.length; i++) {it.next();it.set(arr[i]);}}
}

参数:list-要改组的列表,rnd-用来改组列表的随机源。

7、其他主要方法

7.1、交换方法swap()
  • ​ 函数定义:public static void swap(List<?> list,int i,int j)
  • ​ 在指定列表的指定位置处交换元素。
  • ​ 参数:list-进行元素交换的列表,i-要交换的一个元素的索引,j-要交换的另一个元素的索引。
7.2、替换方法fill()
  • ​ 函数定义:public static void fill(List<? super T> list,T obj)
  • ​ 使用指定元素替换指定列表中的所有元素,线性时间运行。
  • ​ 参数:list-使用指定元素填充的列表,obj-用来填充指定列表的元素。
7.3、复制方法copy()
  • ​ 函数定义:public static void copy(List<? super T> dest,List<? extends T> src)
  • ​ 将所有元素从一个列表复制到另一个列表。执行此操作后,目标列表中每个已复制元素的索引将等同于源列表中该元素的索引,目标列表的长度至少必须等于源列表。
  • ​ 参数:dest-目标列表,src-源列表。
7.4、最小值法min()
  • ​ 函数定义:public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)

  • ​ 根据元素的自然顺序返回给定Collection的最小元素,Collection中的所有元素必须实现Comparable接口,此外,collection中的所有元素都必须是可相互比较的。

  • ​ 参数:coll-将确定其最小元素的collection。

  • ​ 函数定义:public static T min(Collection<? extends T> coll,Comparator<? super T> comp)

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

  • ​ 参数:coll-将确定其最小元素的collection,comp-用来确定最小元素的比较器。

7.5、最大值方法max()
  • ​ 函数定义:public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
  • ​ 根据元素的自然顺序,返回给定collection的最大元素。
  • ​ 参数:coll-将确定其最大元素的collection。
  • ​ 函数定义:public static T max(Collection<?extends T> coll,Comparator<? super T> comp)
  • ​ 根据指定比较器产生的顺序,返回给定collection的最大元素。
  • ​ 参数:coll-将确定其最大元素的collection,comp-用来确定最大元素的比较器
7.6、轮换方法rotate()
  • ​ 函数定义:public static void rotate(List<?> list,int distance)
  • ​ 根据指定的距离轮转指定列表中的元素。
  • ​ 参数:list-要轮换的列表,distance-列表轮换的距离,可以使0、负数或者大于list.size()的数。
7.7、替换所有函数replaceAll()
  • ​ 函数定义:public static boolean replaceAll(List list,T oldVal,T newVal)
  • ​ 使用另一个值替换列表总出现的所有的某一指定值。
  • ​ 参数:list-在其中进行替换的列表;oldVal-将被替换的原值;newVal-替换oldVald的新值。

二、Collection和Collections区别

1.Collection:

Collection是集合类的上层接口。本身是一个Interface,里面包含了一些集合的基本操作。

Collection接口是Set接口和List接口的父接口

2.Collections

Collections是一个集合框架的帮助类,里面包含一些对集合的排序,搜索以及序列化的操作。

Collections是一个类,

Collections 是一个包装类,Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素, 而另一些则不允许,一些 collection 是有序的,而另一些则是无序的。

JDK源码解析之Java.util.Collections相关推荐

  1. JDK源码解析之java.util.AbstractCollection

    AbstractCollection类提供了collection的实现类应该具有的基本方法,具有一定的普适性,可以从大局上了解collection实现类的主要功能. java.util.Abstrac ...

  2. JDK源码解析之Java.util.Collection

    Collection是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素,JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现 一.源码解析 1 ...

  3. JDK源码解析之java.util.ListIterator

    ListIterator是一个功能更加强大的迭代器接口, 它继承于Iterator接口,只能用于各种List类型的访问.可以通过调用listIterator()方法产生一个指向List开始处的List ...

  4. JDK源码解析之java.util.Iterator和java.lang.Iterable

    在Java中,我们可以对List集合进行如下几种方式的遍历:第一种就是普通的for循环,第二种为迭代器遍历,第三种是for each循环.后面两种方式涉及到Java中的iterator和iterabl ...

  5. JDK源码解析之 Java.lang.Compiler

    Compiler类提供支持Java到本机代码编译器和相关服务.在设计上,它作为一个占位符在JIT编译器实现. 一.源码部分 public final class Compiler {private C ...

  6. JDK源码解析之 java.lang.Exception

    异常.是所有异常的基类,用于标识一般的程序运行问题.这些问题通常描述一些会被应用程序捕获的反常情况. 一.源码部分 //继承了java.lang.Throwable public class Exce ...

  7. JDK源码解析之 java.lang.Error

    java.lang.Error 错误.是所有错误的基类,用于标识严重的程序运行问题.这些问题通常描述一些不应被应用程序捕获的反常情况. 一.源码部分 //继承了java.lang.Throwable ...

  8. JDK源码解析之 java.lang.Thread

    位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知识:线程的几种状态.上下文切换 ...

  9. JDK源码解析之 java.lang.Integer

    teger 基本数据类型int 的包装类 Integer 类型的对象包含一个 int 类型的字段 一.类定义 public final class Integer extends Number imp ...

最新文章

  1. ORA-00907:缺少右括号
  2. 2017年第六届数学中国数学建模国际赛(小美赛)C题解题思路
  3. python映射类型-python映射类型的相关介绍
  4. python输出数据到excel-使用python将大量数据导出到Excel中的小技巧分享
  5. 关于bitnami redmine 的一些问题
  6. 通过DLL使两个工程公用部分代码
  7. chrome jsp 显示不正常_JSP程序在chrome下不兼容的问题!
  8. 一文包教会 Python打包.py文件成exe文件发给自己的好友
  9. java中使用switch case报错case expressions must be constant expres
  10. 浅谈文件断点续传和WebUploader的基本结合
  11. Android Studio:Support Library依赖包的版本号
  12. Print Conductor中文版
  13. 深度Linux操作系统使用体验
  14. 怎么在WPS计算机,电脑怎么把wps热点删了?电脑永久删除wps热点的方法
  15. LaTeX矩阵广义逆、伪逆
  16. 网页游戏外挂辅助AMF模拟通讯必备
  17. Spring Data MongoDB简单的增删改查
  18. 梦行扫码付(收银台条码支付 微信钱包条码支付 支付宝二维码支付 手机APP钱包支付 PHP扫码支付 )
  19. C语言骚操作之没有加法运算符
  20. 在iOS上进行WebP编码是一种怎样的体验?

热门文章

  1. linux硬盘保护卡,保护卡下安装Linux
  2. supervisor监控php进程程序,详解Supervisor进程守护监控(转)
  3. java返回object的类型_为什么标准java类的clone()返回Object而不是实际的类型
  4. android打印html页面,Android打印HTML文档
  5. java 静态块初始化_简单了解java中静态初始化块的执行顺序
  6. android jdbc 连接mysql数据库,android怎么用JDBC方法连接mysql数据库
  7. kodi android 目录,Kodi添加本机和电脑上的电影视频、音乐、图片目录教程
  8. 计算机教学难点重点,浅述如何解决小学信息技术教学中的重点、难点
  9. php程序员学什么语言好就业_2019年初中毕业生学什么专业好?学什么专业好就业?...
  10. ie8不兼容java项目_常见IE8兼容性问题及解决