java-RandomAccess

List用来当标记的,是一种标记接口,接口的非典型用法
意思是,随机访问任意下标元素都比较快用处,当要实现某些算法时,会判断当前类是否实现了RandomAccess接口。会根据结果选择不同的算法

实现中使用的标记接口 表示支持快速(一般恒定时间)随机访问。
此接口的目的是允许泛型算法改变它们的行为 提供良好的性能 当应用于随机或者
连续的访问列表。

最好的算法操纵随机访问列表 例如ArrayList 提供二次行为 当应用
顺序访问列表(例如LinkedList) 通用列表算法被鼓励去检查是否给定的列表
在应用一个算法之前,这个接口如果应用于顺序访问列表,则提供较差的性能。
如果必要,改变他们的行为以保证可接受性能。

一般的列表访问算法在访问列表元素之前,都被建议先使用instanceof关键字检查一下列表是否是一个RandomAccess子类,然后再决定采用随机还是顺序方式访问列表中的元素,这样可以保证访问算法拥有最佳的性能。

认识到随机和顺序之前的区别 访问常常模糊的。
例如List 实现渐近线性存取时间。 如果他们得到巨大的 但不变的访问时间在实践中。
这样的表实现 通常应该实现这个接口。作为经验法则,一个list实现 应该实现此接口。对于类的典型实例,这个循环:

   for (int i=0, n=list.size(); i < n; i++)
          list.get(i);

比这个loop循环:

  for (Iterator i=list.iterator(); i.hasNext(); )
         i.next();

快,那么它应该实现RandomAccess接口。

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 array
            for (int i=size; i>1; i--)
                swap(arr, i-1, rnd.nextInt(i));

            // Dump array back into list
            ListIterator it = list.listIterator();
            for (int i=0; i<arr.length; i++) {
                it.next();
                it.set(arr[i]);
            }
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值