java.lang.Collections
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的更多相关文章
- 关于java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap的错误解决办法
在JavaEE开发中,在把配置文件中的数据或用户表单提交上来的数据,封装在相应JavaBean的对象的对应属性中时:在实际开发中,使用第三方法工具包BeanUtils(commons-beanutil ...
- java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap报错解决
在使用 commons-beanutils-1.9.2.jarcommons-logging-1.1.1.jar 的时候报错 java.lang.NoClassDefFoundError: org/a ...
- java.lang.ClassNotFoundException: org.apache.commons.collections.FastHashMap
七月 26, 2017 1:52:15 上午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() for ...
- 出现java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap错误问题解决
首先出现这个问题,你应该是用了 BeanUtils.populate(meter,map); import org.apache.commons.beanutils.BeanUtils;并且导入了co ...
- java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得
我遇到这样的问题,本地部署时抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来,查看日志发现加载了太多资源到内存,本地的性 ...
- java.lang.Comparable<T> 接口
package java.lang; import java.util.*; public interface Comparable<T> { public int compareTo(T ...
- [转]java.lang.OutOfMemoryError:GC overhead limit exceeded
我遇到这样的问题,本地部署时抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来,查看日志发现加载了太多资源到内存,本地的性 ...
- java 异常java.lang.UnsupportedOperationException
在项目中采用一个枚举的集合,本人采用Collections中的空集合Collections.emptyList()在添加时发生异常: 常见集合如下: private List<VacationC ...
- java.lang.Comparable接口
转自:http://blog.csdn.net/zccst/article/details/5092920 java.lang.Comparable 接口 作者: zccst java.lang.Co ...
随机推荐
- Linux目录结构详解(一)
Linux目录结构,在逻辑上所有目录只有一个顶点,即/(根目录),是所有目录的起点.根下面类似于一个倒挂着的树的结构. Linux目录按照类别组织: 应用程序 /usr/bin 数据文件,帮助/usr ...
- Echarts数据可视化dataZoom,开发全解+完美注释
全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...
- 使用测试思路快速学习Python-适合测试工程师的学习方法
本文采用Python doctest单元测试的方法,直接用代码学习代码,滚雪球式的迭代学习. doctest是一个python标准库自带的轻量单元测试工具,适合实现一些简单的单元测试.它可以在docs ...
- IDoc 基础知识
Application Link Enabling ALE主要为了分布式业务系统而设计的.它可以使业务流程中的每个步骤分布在不同的SAP系统上,系统间可以通过IDoc交互数据.IDoc可以认为是个信封 ...
- java 集合之实现类ArrayList 和 LinkedList
List 的方法列表 方法名 功能说明 ArrayList() 构造方法,用于创建一个空的数组列表 add(E e) 将指定的元素添加到此列表的尾部 get(int index) 返回此列表中指定位置 ...
- ELK系列~log4-nxlog-Fluentd-elasticsearch写json数据需要注意的几点
经验与实践 前两篇文章里我们介绍了nxlog的日志收集和转发<ELK系列~Nxlog日志收集加转发(解决log4日志换行导致json转换失败问题)>,今天我们主要总结一下,在与log4和f ...
- 备忘:有MTU值设置不当导致的部分网站无法访问问题
如题,有时候突然weibo.com,webQQ等网站网络连接超时,怎么找也没得原因,今天管理电信的光猫,发现设置的MTU的1400,突然想起之前电脑和路由器上设置的MTU是1500,感觉可能是这个问题 ...
- 在for、foreach循环体中添加数组元素
在开发工作中遇到这样一种情形,需要在循环体中动态向遍历中的数组添加元素并在当前循环遍历中使用数组的全部元素. 首先使用foreach循环来遍历数组,将代码简化抽象如下: $arr = array(1, ...
- 基于 webpack 的 chrome 扩展开发探索
起 最近利用闲暇时间在进行一款 chrome 扩展 V2EX-HELPER 的开发(如果巧遇 V 友欢迎试用),今天把它彻底改成了用 webpack 打包依赖的模式,不由得感概 webpack 的强大 ...
- Unity3D手机斗地主游戏开发实战(01)_发牌功能实现
园子荒废多年,闲来无事,用Unity3D来尝试做一个简单的小游戏,一方面是对最近研究的Unity3D有点总结,一方面跟广大的园友相互学习和提高.话不多说,进入正题~ 一.创建项目 1.创建Unity2 ...