Collections中sort(),binarySearch(), shuffle()源代码的简单分析

  • sort()
    可以看到,Collections并不是直接对List进行排序操作,这是因为排序过程中可能会涉及大量的随机访问,类似于LinkedList这样的链表结构就会十分耗时。所以 先将List转换为Arrays(普通数组),然后调用Arrays.sort()进行排序
    完成排序之后, 再一个一个地,把Arrays的元素复制到List中
    
    在Arrays.sort()方法中,由 LegacyMergeSort.userRequested决定是采用MergeSort还是TimSort。
   
    LegacyMergeSort.userRequested由"java.util.Arrays.useLegacyMergeSort"设置。
    TimSort是改进后的归并排序,对归并排序在已经反向排好序的输入时表现为O(n^2)的特点做了特别优化。对已经正向排好序的输入减少回溯。对两种情况(一会升序,一会降序)的输入处理比较好(摘自百度百科)。

  • binarySearch()
    binarySearch存在两种方法:indexedBinarySearch()和iteraotrBinarySearch(),前者针对具备随机存取能力的List以及小的链表,后者适用于大的链表。

              

                  BINARYSEARCH_THRESHOLD用于判断一个链表是大还是小,它的值为5000

    
    indexBinarySearch()和iteratorBinarySearch()只在一个地方存在区别。

                   indexBinarySearch():

             

                    iteratorBinarySearch():

             

    可以看到,它们在取midVal采用了不同的方法。前者使用了list默认的get()方法,后者使用了Collections.get()方法。
    对于链表而言,区别在于:list默认的get()方法每次都是从头部开始遍历,直到指定位置。 Collections.get()方法会记住上次查询的位置,然后从该位置开始遍历,直到指定位置

  • shuffle()

             

                   shuffle()方法一样对链表采用了特殊策略,当链表长度大于SHUFFLE_THRESHOLD(设置为5)时,会先把链表转换为数组,然后再洗牌。

    洗牌用了随机数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值