java.lang.Collections

此类完全由在collection上进行操作或返回 collection 的静态方法组成。也就是说Collections提供了对Collection集合操作的一些方法。jdk类似这种的还有几个,例如:Array和Arrays,Object和Objects。

Collections类没有子类且构造函数是私有的,也就导致了它的所有对外方法都是静态的。

主要方法

  • Sort:排序

提供了两种形式:

public static <T extends Comparable<? super T>> void sort(List<T> list)

public static <T> void sort(List<T> list, Comparator<? super T> c)

说明:

1.两种方式区别就是多了一个参数Comparator,当使用第一种方式时,Comparator默认为空

2.if (LegacyMergeSort.userRequested)legacyMergeSort(a);如果userRequested有指定值,则使用legacyMergeSort,否则,使用TimSort排序

3.sort()方法底层使用TimSort排序算法。如果 c == null (使用第一种形式或者第二种形式为null)时,会采用ComparableTimSort.sort(a, 0, a.length, null, 0, 0);否则,采用TimSort排序算法。

4.TimSort排序是演化版的归并排序,更确切的说,是有归并排序和插入排序组合而成的。其时间复杂度为一般小于O(nlg2(n))

  • binarySearch:二分查找

提供了两种形式:

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

public static <T> int binarySearch(List<? extends T> list,T key,Comparator<? super T> c)

说明:

1、 两种方式的区别也是多了一个参数Comparator.

2、二分查找要求带排序的List列表是有序的并且元素可比较。这点从list参数List<? extends Comparable<? super T>>可以看出。

3、二分查找默认提供了两种方式:

a. indexedBinarySearch:基于下标来二分法

b. iteratorBinarySearch:迭代器二分法

其中使用二者的条件是:如果指定列表没有实现 RandomAccess 接口并且是一个大型列表,这时候选择indexedBinarySearch,否则选择iteratorBinarySearch

即:if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)

4. 在二分法取中间结点下标时使用了 位移运算符 >>> 可以借鉴使用。

  • reverse:反转

很好理解,就是把集合中的元素顺序反转

  • shuffle:清洗

可以理解为洗牌动作,效果就是把集合中的元素打乱,实现是利用了random随机数

  • fill:填充

使用指定元素替换指定列表中的所有元素。

  • min/max:最小/最大值
  • rotate:回转

函数形式:

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

可以理解为把集合里的元素理解为圆中的多个点,其中,rotate操作可以正向位移或者逆向位移,位移后所有元素顺序不变,变的是所在的位置。

举例:

集合list中包含元素[a,b,c,d,e],如果指定distance=2,即调用方法

Collections.rotate(list,2);
后,集合list中的元素顺序为:[d,e,a,b,c]。也就是集合元素整体正向移动了两个位置。注意,此方法用于子列表时非常有用,可以在保留其余元素顺序的同时,在列表中移动一个或多个元素。对于上面例子调用:Collections.rotate(list.subString(1,4),2);

得到的列表为:[a,d,c,b,e]

分析:list.subString(1,4)将得到列表为[b,c,d],然后[b,c,d]移动两个单位,而原集合中a和e位置不变。所以得到结果如上所示。

  • indexOfSubList:字串出现的位置

也就是字串在原串中首次出现的位置下标。

  • EMPTY_SET EMPTY_LIST EMPTY_MAP

一般作为在函数的入口处判断参数如果为空,则直接返回对应的集合类型。而不是返回null.例如:

public List get(List<String> list){
if(list.isEmpty()){
return Collections.EMPTY_LIST;
}
... ...
}

总结

1、对于集合的操作,可以优先考虑使用Collections提供的方法

2、对于字符串操作,如果有集合比较合适的函数,则可以先把字符串转为集合,进一步调用集合中的相应方法。字符串转集合可以使用guava提供的Splitter类

java.lang.Collections的更多相关文章

  1. 关于java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap的错误解决办法

    在JavaEE开发中,在把配置文件中的数据或用户表单提交上来的数据,封装在相应JavaBean的对象的对应属性中时:在实际开发中,使用第三方法工具包BeanUtils(commons-beanutil ...

  2. java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap报错解决

    在使用 commons-beanutils-1.9.2.jarcommons-logging-1.1.1.jar 的时候报错 java.lang.NoClassDefFoundError: org/a ...

  3. java.lang.ClassNotFoundException: org.apache.commons.collections.FastHashMap

    七月 26, 2017 1:52:15 上午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() for ...

  4. 出现java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap错误问题解决

    首先出现这个问题,你应该是用了 BeanUtils.populate(meter,map); import org.apache.commons.beanutils.BeanUtils;并且导入了co ...

  5. java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得

    我遇到这样的问题,本地部署时抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来,查看日志发现加载了太多资源到内存,本地的性 ...

  6. java.lang.Comparable<T> 接口

    package java.lang; import java.util.*; public interface Comparable<T> { public int compareTo(T ...

  7. [转]java.lang.OutOfMemoryError:GC overhead limit exceeded

    我遇到这样的问题,本地部署时抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来,查看日志发现加载了太多资源到内存,本地的性 ...

  8. java 异常java.lang.UnsupportedOperationException

    在项目中采用一个枚举的集合,本人采用Collections中的空集合Collections.emptyList()在添加时发生异常: 常见集合如下: private List<VacationC ...

  9. java.lang.Comparable接口

    转自:http://blog.csdn.net/zccst/article/details/5092920 java.lang.Comparable 接口 作者: zccst java.lang.Co ...

随机推荐

  1. Zeppelin源码

    1.概述 在大数据应用场景中,处理数据分析方面,由于开发者的水平不一样,使用的编程语言也不尽相同,可能会涉及到R.Python.Java.Scala等,数据计算模型也估计不一样,可能涉及的有Spark ...

  2. PHP 注释 数据类型 变量的定义/输出 类型的获取/转换 可变变量

    注释方法: 1,单行注释:     // 2,  多行注释:     /*   */ 二,数据类型 1,integer(整数型):在三十二位操作系统中它的有效范围是:-2147483648~+2147 ...

  3. ftpclient 550 permission denied

    遇到一个坑,ftp服务器有主被动模式,如果ftpclient 没有设置模式,默认就是主动模式,如果ftp服务器是被动模式,那么使用ftpclient就执行上传和下载,就会失败, 添加ftpClient ...

  4. 容器平台选型的十大模式:Docker、DC/OS、K8S 谁与当先?

    作者:刘超   来自:网易云 基础服务 无论是在社区,还是在同客户交流的过程中,总会被问到到底什么时候该用 Docker?什么时候用虚拟机?如果使用容器,应该使用哪个容器平台? 显而易见,我不会直接给 ...

  5. win10 uwp 无法附加到CoreCLR

    本文说的是在vs调试无法附加到CoreCLR.拒绝访问.已经如何去解决,可能带有一定的主观性和局限性,说的东西可能不对或者不符合每个人的预期.如果觉得我有讲的不对的,就多多包含,或者直接关掉这篇文章, ...

  6. ADO.NET生成的数据库连接字符串解析

    1.概述 当我们使用ADO.NET数据实体模型生成的时候,在项目目下生成一个.edmx文件的同时,还会在app.config里面出现如下一个代码串: <?xml version="1. ...

  7. call()与apply() 改变this指向

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #a5b2b9 } span.Apple-tab-span ...

  8. 脚本div实现拖放功能

    脚本div实现拖放功能 网页上有很多拖曳的操作,比如拖动树状列表,可拖曳的图片等. 1.原生拖放实现 <!doctype html> <html lang="en" ...

  9. LeetCode 606. Construct String from Binary Tree (建立一个二叉树的string)

    You need to construct a string consists of parenthesis and integers from a binary tree with the preo ...

  10. python去除读取文件中多余的空行

    今天在写登录程序练习的时候,黑名单文件中多了几行空行.导致运行的时候报错:IndexError: list index out of range 代码 brackData = open(brackDa ...