1700444920
1700444921
System.out.println(“索引值(indexOf):”+index1);
1700444922
1700444923
System.out.println(“索引值(binarySearch):”+index2);
1700444924
1700444925
}
1700444926
1700444927
输出的index1和index2应该一致吧,都是从一个列表中查找相同的元素,只是使用的算法不同嘛。但是很遗憾,结果不一致:
1700444928
1700444929
索引值(indexOf):0
1700444930
1700444931
索引值(binarySearch):1
1700444932
1700444933
indexOf返回的是第一个元素,而binarySearch返回的是第二个元素(索引值是1),这是怎么回事呢?
1700444934
1700444935
这是因为indexOf是通过equals方法判断的,equals等于true就认为找到符合条件的元素了,而binarySearch查找的依据是compareTo方法的返回值,返回0即认为找到符合条件的元素。
1700444936
1700444937
仔细审查一下代码,我们覆写了compareTo和equals方法,但是两者并不一致。使用indexOf方法查找时,遍历每个元素,然后比较equals方法的返回值,因为equals方法是根据code判断的,因此当第一次循环时,equals就返回了true, indexOf方法结束,查找到指定值。而使用binarySearch二分法查找时,依据的是每个元素的compareTo方法返回值,而compareTo方法又是依赖name属性的,name相等就返回0,binarySearch就认为找到元素了。
1700444938
1700444939
问题明白了,修改也就很容易了,将equals方法修改成判断name是否相等即可,虽然可以解决问题,但这是一个很无奈的解决办法,而且还要依赖我们的系统是否支持此类修改,因为相等逻辑已经发生了很大的变化。
1700444940
1700444941
从这个例子中,我们可以理解两点:
1700444942
1700444943
indexOf依赖equals方法查找,binarySearch则依赖compareTo方法查找。
1700444944
1700444945
equals是判断元素是否相等,compareTo是判断元素在排序中的位置是否相同。
1700444946
1700444947
既然一个是决定排序位置,一个是决定相等,那我们就应该保证当排序位置相同时,其equals也相同,否则就会产生逻辑混乱。
1700444948
1700444949
注意 实现了compareTo方法,就应该覆写equals方法,确保两者同步。
1700444950
1700444951
1700444952
1700444953
1700444955
编写高质量代码:改善Java程序的151个建议 建议76:集合运算时使用更优雅的方式
1700444956
1700444957
在初中代数中,我们经常会求两个集合的并集、交集、差集等,在Java中也存在着此类运算,那如何实现呢?一提到此类集合操作,大部分的实现者都会说:对两个集合进行遍历,即可求出结果。是的,遍历可以实现并集、交集、差集等运算,但这不是最优雅的处理方式。下面来看看如何进行更优雅、快速、方便的集合操作。
1700444958
1700444959
(1)并集
1700444960
1700444961
也叫做合集,把两个集合加起来即可,这非常简单,代码如下:
1700444962
1700444963
public static void main(String[]args){
1700444964
1700444965
List<String>list1=new ArrayList<String>();
1700444966
1700444967
list1.add(“A”);
1700444968
1700444969
list1.add(“B”);
[
上一页 ]
[ :1.70044492e+09 ]
[
下一页 ]