1700444661
编写高质量代码:改善Java程序的151个建议 建议74:不推荐使用binarySearch对列表进行检索
1700444662
1700444663
对一个列表进行检索时,我们使用得最多的是indexOf方法,它简单、好用,而且也不会出错,虽然它只能检索到第一个符合条件的值,但是我们可以生成子列表后再检索,这样也就可以查找出所有符合条件的值了。
1700444664
1700444665
Collections工具类也提供一个检索方法:binarySearch,这个是干什么的?该方法也是对一个列表进行检索的,可查找出指定值的索引值,但是在使用这个方法时就有一些注意事项了,我们看如下代码:
1700444666
1700444667
public static void main(String[]args){
1700444668
1700444669
List<String>cities=new ArrayList<String>();
1700444670
1700444671
cities.add(“上海”);
1700444672
1700444673
cities.add(“广州”);
1700444674
1700444675
cities.add(“广州”);
1700444676
1700444677
cities.add(“北京”);
1700444678
1700444679
cities.add(“天津”);
1700444680
1700444681
//indexOf方法取得索引值
1700444682
1700444683
int index1=cities.indexOf(“广州”);
1700444684
1700444685
//binarySearch查找到索引值
1700444686
1700444687
int index2=Collections.binarySearch(cities,“广州”);
1700444688
1700444689
System.out.println(“索引值(indexOf):”+index1);
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);
[
上一页 ]
[ :1.70044466e+09 ]
[
下一页 ]