JDK源码解析之Java.util.Collections

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 是有序的,而另一些则是无序的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu下安装jdk

安装1.5 sudo apt-get install sun-java5-jdk sudo update-alternatives --config java sudo update-alternatives --config javac 安装1.6 sudo apt-get install sun-java6-jdk sudo update-alternatives --config java sudo update-alternatives --config javac 转载:http:/…

使用validate验证数据库

验证数据备份集是不是可以用来做恢复和数据文件是否损坏、坏块 三种方式&#xff1a; 1.validate validate database ;validate tablespace users; validate datafile 1; validate archivelog all validate datafile 1 block 10; validate backupset 28; db…

JDK源码解析之java.util.AbstractCollection

AbstractCollection类提供了collection的实现类应该具有的基本方法&#xff0c;具有一定的普适性&#xff0c;可以从大局上了解collection实现类的主要功能。 java.util.AbstractCollection这个类提供了对接口Collection骨骼级的实现。 一、源码解析 1、iterator():返回一个迭…

沟通linux与windows的wine

据Netcraft网站调查&#xff0c;现在互联网上的主机有75&#xff05;以上采用Linux作为操作系统。作为服务器操作系统&#xff0c;Linux已经站稳了脚步&#xff0c;可是在桌面 操作系统上&#xff0c;还是微软的“瘟到死”一支独秀。这倒不是说Linux不好&#xff0c;很大原因我…

备份spfil、控制文件等

delete backup&#xff1b; delete backupset delete noprompt backup backup keep forver database 永久保存恢复目录中支持此命令 show parameter control 备份spfile backup spfile backup current contrlfile configure controlfile autoback …

日常问题——阿里云服务器ssh经常一段时间就断掉解决办法

#vim /etc/ssh/sshd_config 找到下面两行 #ClientAliveInterval 0 #ClientAliveCountMax 3 去掉注释&#xff0c;改成 ClientAliveInterval 30 ClientAliveCountMax 86400 这两行的意思分别是 1、客户端每隔多少秒向服务发送一个心跳数据 2、客户端多少秒没有相应&#…

在Ubuntu 8.04 LTS(hardy)下安装配置nginx和fastcgi方式的php

最近我们(瑞豪开源Xen VPS: http://www.RasHost.com)的一个客户要求在他的Ubuntu 8.04 VPS上安装一个高性能的nginx&#xff0c;下面是我的安装记录。 由于Ubuntu 804已经包含了nginx&#xff0c;所以根本不要编译&#xff0c;安装超简单&#xff01; 在VPS上修改/etc/apt/so…

apt-get包管理详解

apt-get使用source.list文件进行软件包管理。如果您想了解关于如何编辑和更新source.list中的条目的信息&#xff0c;请参阅SourcesList“起初GNU/Linux系统中只有.tar.gz。用户必须自己编译他们想使用的每一个程序。在Debian出现之後&#xff0c;人们认为有必要在系统中添 加一…

awk命令

awk是一个强大的文本分析工具&#xff0c;相对于grep的查找&#xff0c;sed的编辑&#xff0c;awk在其对数据分析并生成报告时&#xff0c;显得尤为强大。简单来说awk就是把文件逐行的读入&#xff0c;以空格为默认分隔符将每行切片&#xff0c;切开的部分再进行各种分析处理。…

ubuntu安装字符集

sudo locale-gen zh_CN.GBK sudo locale-gen zh_CN

正则表达式和grep

正则表达式(regular expression, RE)是一种字符模式&#xff0c;用于在查找过程中匹配指定的字符。 在大多数程序里&#xff0c;正则表达式都被置于两个正斜杠之间;例如/lv[o0]e/就是由正斜杠界定的正则表达式&#xff0c;它将匹配被查找的行中任何位置出现的相同模式。在正则表…

GC 垃圾回收

垃圾回收机制是由垃圾收集器Garbage Collection GC来实现的&#xff0c;GC是后台的守护进程。它的特别之处是它是一个低优先级进程&#xff0c;但是可以根据内存的使用情况动态的调整他的优先级。因此&#xff0c;它是在内存中低到一定限度时才会自动运行&#xff0c;从而实现对…

如何让你变得魅力十足

我们每个人都希望自己在某些方面对他人来说是有用的。我们渴望那种被人需要的感觉&#xff0c;觉得自己是有能力的&#xff0c;就像我们在某方面很与众不同&#xff0c;很独特一样。 有些人非常有吸引力。他们是那些每当需要帮助便会被想起的人。他们是那些另你觉得非常有帮助…

日志linux

syslog日志系统&#xff1a; syslogd 系统&#xff0c;非内核产生的信息 man 2 syslog klogd 内核&#xff0c;专门负责内核产生的信息 man 3 syslog /var/log/messages 系统标准错误日志信息&#xff0c;非内核 syslogd /var/log/dmesg klogd 共同配置文件etc/…

sysbench的安装和做性能测试

sysbench是一个模块化的、跨平台、多线程基准测试工具&#xff0c;主要用于评估测试各种不同系统参数下的数据库负载情况。关于这个项目的详细介绍请看&#xff1a;http://sysbench.sourceforge.net。它主要包括以下几种方式的测试&#xff1a;1、cpu性能2、磁盘io性能3、调度程…

加密解密

PKI public key Infrastructure 公钥基础设施 CRl 证书吊销列表 CA证书颁发机构 Certificate Authority x509 证书 包括公钥、过期时间、证书的合法拥有者、证书如何被使用 CA的信息 CA的校验码等等 Pki实现方式 TLS/ssl:x509 opengpg ssl安全的套接字层…

高性能MySQL(1)——MYSQL架构

MySQL最重要、最与众不同的特性是它的存储引擎架构&#xff0c;这种架构将查询处理与数据的存储/提取相分离&#xff0c;使得可以在使用时根据不同的需求来选择数据存储的方式。 一、Mysql逻辑架构 如果能在头脑中构建出一幅MySQL各组件之间如何协同工作的架构图&#xff0c;就…

数据库设计中的14个关键技巧

1. 原始单据与实体之间的关系  可以是一对一、一对多、多对多的关系。在一般情况下&#xff0c;它们是一对一的关系&#xff1a;即一张原始单据对应且只对应一个实体。在特殊情况下&#xff0c;它们可能是一对多或多对一的关系&#xff0c;即一张原始单证对应多个实体&#xf…

高性能MySQL(2)——Schema与数据类型的优化

良好的逻辑设计和物理设计是高性能的基石&#xff0c;应该根据系统将要执行的查询语句来设计 schema,这往往需要权衡各种因素。 一、选择优化的数据类型 MySQL支持的数据类型非常多&#xff0c;选择正确的数据类型对于获得高性能至关重要。不管 存储哪种类型的数据&#xff0c…

用户权限sudo、suid、sgid以及facl等

su 切换用户或以指定用户运行命令。 使用su可以指定运行命令的身份(user/group/uid/gid)。 为了向后兼容&#xff0c;su默认不会改变当前目录&#xff0c;且仅设置HOME和SHELL这两个环境变量(若目标用户非root&#xff0c;则还设置USER和LOGNAME环境变量)。推荐使用--login选项…