打字猴:1.70044469e+09
1700444690
1700444691 System.out.println(“索引值(binarySearch):”+index2);
1700444692
1700444693 }
1700444694
1700444695 先不考虑运行结果,直接看JDK上对binarySearch的描述:使用二分搜索法搜索指定列表,以获得指定对象。其实现的功能与indexOf是相同的,只是使用的是二分法搜索列表,所以估计两种方法返回结果是一样的,看结果:
1700444696
1700444697 索引值(indexOf):1
1700444698
1700444699 索引值(binarySearch):2
1700444700
1700444701 结果不一样,虽然说我们有两个“广州”这样的元素,但是返回的结果都应该是1才对呀,为何binarySearch返回的结果是2呢?问题就出在二分法搜索上,二分法搜索就是“折半折半再折半”的搜索方法,简单,而且效率高。看看JDK是如何实现的。
1700444702
1700444703 public static<T>int binarySearch(List<?extends Comparable<?super T>>list, T key){
1700444704
1700444705 if(list instanceof RandomAccess||list.size()<5000)
1700444706
1700444707 //随机存取列表或者元素数量少于5000的顺序存取列表
1700444708
1700444709 return Collections.indexedBinarySearch(list, key);
1700444710
1700444711 else
1700444712
1700444713 //元素数量大于5000的顺序存取列表
1700444714
1700444715 return Collections.iteratorBinarySearch(list, key);
1700444716
1700444717 }
1700444718
1700444719 ArrayList实现了RandomAccess接口,是一个顺序存取列表,使用了indexdBinarySearch方法,代码如下:
1700444720
1700444721 private static<T>int indexedBinarySearch(List<?extends Comparable<?super T>>
1700444722
1700444723 list, T key){
1700444724
1700444725 //默认上界
1700444726
1700444727 int low=0;
1700444728
1700444729 //默认下界
1700444730
1700444731 int high=list.size()-1;
1700444732
1700444733 while(low<=high){
1700444734
1700444735 //中间索引,无符号右移1位
1700444736
1700444737 int mid=(low+high)>>>1;
1700444738
1700444739 //中间值
[ 上一页 ]  [ :1.70044469e+09 ]  [ 下一页 ]