【发布时间】:2015-02-28 08:39:29
【问题描述】:
从下面的代码中,我了解到,TreeSet 和 TreeMap 不需要重写 equals() 和 hashCode() 方法,既不需要排序,也不需要搜索。
public class ComparableTest implements Comparable<ComparableTest> {
private String username;
public ComparableTest(String name) {
this.username = name;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int compareTo(ComparableTest o) {
return username.compareTo(o.getUsername());
}
@Override
public String toString() {
return this.getUsername();
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
ArrayList<ComparableTest> comparableTestsList = new ArrayList<ComparableTest>();
ArrayList<ComparableTest> comparableTestsList2;
comparableTestsList.add(new ComparableTest("Second Name"));
comparableTestsList.add(new ComparableTest("First name"));
System.out.println("Orignal Array List = " + comparableTestsList);
// making a clone to test this list in Treeset
comparableTestsList2 = (ArrayList<ComparableTest>) comparableTestsList
.clone();
// Sorting the first arraylist which works
Collections.sort(comparableTestsList);
System.out.println("Sorted Array List = " + comparableTestsList);
// searching the first array which does not work as equals method has
// not been overriden
int position = comparableTestsList.indexOf(new ComparableTest(
"First name"));
System.out.println("The position of First name is = " + position);
//using the cloned collection in TreeSet
TreeSet<ComparableTest> ts = new TreeSet<ComparableTest>(
comparableTestsList2);
System.out.println("The value in Tree Set is = " + ts);
System.out.println("The position of First name is = " + ts.contains(new ComparableTest("First name")));//works fine
//using the cloned collection in TreeMap
TreeMap<ComparableTest, String> tMap = new TreeMap<>();
for(ComparableTest ct: comparableTestsList2) {
tMap.put(ct, "anushree");
}
System.out.println("The value in Tree Map is = " + tMap);
System.out.println(tMap.get(new ComparableTest("First name")));//works fine
}
}
这与 javadoc http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html 中的内容完美匹配 TreeSet 实例使用其 compareTo(或 compare)方法执行所有元素比较,因此从集合的角度来看,此方法认为相等的两个元素是相等的。一个集合的行为是明确定义的,即使它的排序与equals不一致;它只是不遵守 Set 接口的一般约定。
还有写着: 注意,一个集合维护的顺序(无论是否提供显式比较器)必须与equals一致才能正确实现Set接口。
equals() 和 hashCode() 如何为 TreeSet 和 TreeMap 提供图片?我可以得到一个代码示例。谢谢!
【问题讨论】: