zoukankan      html  css  js  c++  java
  • RandomAccess

    RandomAccess是一个标记接口,用于标明实现该接口的List支持快速随机访问,主要目的是使算法能够在随机和顺序访问的list中表现的更加高效。

    备注:随机访问并不是指能够随机获取一个元素,就像随机数,而是想访问哪个就访问哪个,不受限制

    为什么是快速随机访问呢?我们提供一个函数来分析:

    binarySearch方法:

    public static <T>  
        int binarySearch(List<? extends Comparable<? super T>> list, T key) {  
            if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)  
                return Collections.indexedBinarySearch(list, key);  
            else  
                return Collections.iteratorBinarySearch(list, key);  
        }  

    可知:支持RandomAccess的类使用indexedBinarySearch,否则使用iteratorBinarySearch

    indexedBinarySearch方法:

    private static <T>  
        int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {  
            int low = 0;  
            int high = list.size()-1;  
      
            while (low <= high) {  
                int mid = (low + high) >>> 1;  
                Comparable<? super T> midVal = list.get(mid);  
                int cmp = midVal.compareTo(key);  
      
                if (cmp < 0)  
                    low = mid + 1;  
                else if (cmp > 0)  
                    high = mid - 1;  
                else  
                    return mid; // key found  
            }  
            return -(low + 1);  // key not found  
        } 

    iteratorBinarySearch方法:

    private static <T>  
        int iteratorBinarySearch(List<? extends Comparable<? super T>> list, T key)  
        {  
            int low = 0;  
            int high = list.size()-1;  
            ListIterator<? extends Comparable<? super T>> i = list.listIterator();  
      
            while (low <= high) {  
                int mid = (low + high) >>> 1;  
                Comparable<? super T> midVal = get(i, mid);  
                int cmp = midVal.compareTo(key);  
      
                if (cmp < 0)  
                    low = mid + 1;  
                else if (cmp > 0)  
                    high = mid - 1;  
                else  
                    return mid; // key found  
            }  
            return -(low + 1);  // key not found  
        } 

    可知:支持RandomAccess的类访问元素时使用get,get方法的本质是简单的for循环,不支持RandomAccess的类访问元素使用iterator,for循环比iterator高效,因此可称为快速随机访问。

  • 相关阅读:
    Python随笔——Map之键对应多值的处理
    Python操作cx_Oracle笔记
    jmeter进阶之Beanshell引用Java代码
    碎片记录——JMeter之 http post json对象与参数化调用,以及beanshell 引用Java源码
    java源码生成可运行jar
    小记:web安全测试之——固定session漏洞
    Git关联JIRA的issue
    APP稳定性测试-monkey执行
    maven之assembly插件
    wrapper配置文件详解
  • 原文地址:https://www.cnblogs.com/yanze/p/10083478.html
Copyright © 2011-2022 走看看