集合中的元素必须做到compareTo和equals的同步
package performance;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
class City implements Comparable<City> {
//城市编码
private String code;
//城市名称
private String name;
public City(String code, String name) {
super();
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(City o) {
//按照城市名称排序
return new CompareToBuilder()
.append(name, o.name)
.toComparison();
}
@Override
public boolean equals(Object obj) {
if(obj == null) {
return false;
}
if(obj == this) {
return true;
}
if(obj.getClass() != getClass()) { //判断类型
return false;
}
City city = (City)obj;
//根据code判断是否相等
return new EqualsBuilder()
.append(code, city.code)
.isEquals();
}
}
测试类:
public static void main(String[] args) {
List<City> cities = new ArrayList<City>();
cities.add(new City("021", "上海"));
cities.add(new City("021", "沪"));
//排序
Collections.sort(cities);
//查找对象
City city = new City("021", "沪");
//indexOf方式查询到索引值
int index1 = cities.indexOf(city);
//binarySearch查询到索引值
int index2 = Collections.binarySearch(cities, city);
System.out.println("索引值(indexOf): "+index1);
System.out.println("索引值(binarySearch) "+index2);
}
输出结构:
索引值(indexOf): 0
索引值(binarySearch) 1
question:为什么index1和index2不一致呢?
这是因为indexOf 是通过equals方法判断的,而binarySearch查找的依据是compareTo方法的返回值,返回0即认为找到符合条件的元素。
从这个例子中,我们可以理解:
1,.indexOf依赖equals方法查找,binarySearch则依赖compareTo方法查找
2.equals判断元素是否相等,compareTo是判断元素在排序中的位置是否相同
既然一个排序位置,一个决定元素是否相等,那么我们就应该保证当排序正确是时,其equals也相同,否则会产生逻辑混乱。