zoukankan      html  css  js  c++  java
  • 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类

  • 相关阅读:
    Alpha冲刺总结
    软工实践个人总结
    9组Beta冲刺3/5
    9组Beta冲刺总结
    9组Alpha冲刺6/6
    9组Beta冲刺2/5
    9组Alpha冲刺5/6
    9组Beta冲刺1/5
    cocos2d: 使用TexturePacker , pvr.ccz, CCSpriteBatchNode, CCSpriteFrameCache
    cocos2d: 设置容器透明度及添加UIViewController
  • 原文地址:https://www.cnblogs.com/uodut/p/7581566.html
Copyright © 2011-2022 走看看