此博客是本人从学生时代开始做笔记所用, 部分是工作所遇问题,做填坑笔记,部分闲来查阅资料,加上自己的理解所总结的学习笔记, 常忙得不可开交,若漏了资料来源,望通知~ 前路漫漫,写点东西告诉自己正在一点点进步,而不要迷失于繁忙。

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高效,因此可称为快速随机访问。

 

posted @ 2018-12-07 16:06  炎泽  阅读(624)  评论(0编辑  收藏  举报