Collections.binarySearch

首先,RandomAccess接口用来标记一个List是支持高性能随机访问的,而BINARYSEARCH_THRESHOLD是Collections的一个常量(5000),它是二分查找的阀值。  
binarySearch提供一个二分法查找的方法,参数是List和一个需要查找的key:
  public static <T>  int binarySearch(List<? extends Comparable<? super T>> list, T key)
当一个List支持高性能随机访问,或者大小小于二分查找阀值的时候,按下标二分查找;否则,用迭代器实现二分查找:
        if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
            return Collections.indexedBinarySearch(list, key);
        else
            return Collections.iteratorBinarySearch(list, key);


------------------------------------------------------------------------------------------
indexedBinarySearch方法在比较的时候会按照下标来获取列表中的元素:
            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
以上的步骤都在循环中执行,循环条件是事先定义的最小下标小于最大下标:
        int low = 0;
        int high = list.size()-1;


        while (low <= high) {...}
每次比较前,把mid置为low和high的中间位置,如果low+high是奇数,则对(low + hight) / 2向下取整。这个过程可以用向右移位完成:  int mid = (low + high) >>> 1;
最后,如果找不到,则返回一个负数:return -(low + 1);
----------------------------------------------------------------------------
iteratorBinarySearch的算法和上面完全一致,只是要用迭代器取出List中的元素
        ListIterator<? extends Comparable<? super T>> i = list.listIterator();
        ...
        Comparable<? super T> midVal = get(i, mid);
---------------------------------------------------------------------------
Collections还提供了另外两个多态方法,在上述两个二分查找方法中增加一个参数Comparator,在比较元素的时候使用这个特定的比较器,其他实现完全一致。因此,也就提供了另一个binarySearch的公共方法,在原先的方法里加上比较器参数:
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {
        if (c==null)
            return binarySearch((List) list, key);


        if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
            return Collections.indexedBinarySearch(list, key, c);
        else
            return Collections.iteratorBinarySearch(list, key, c);
    }

你可能感兴趣的:(Collection,binarySearch)