读编写高质量代码整理(四)

 集合中的元素必须做到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也相同,否则会产生逻辑混乱。

 

你可能感兴趣的:(读编写高质量代码整理(四))