我在充当元素的类中重写了hashcode、equals、compareTo,在里面加上输出语句。然后调了几个TreeSet的方法进行操作,只有compareTo方法被执行过,由此能不能断定可以不重写equals?import java.util.NavigableSet;
import java.util.TreeSet;public class C { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub NavigableSet<P> s = new TreeSet<P>();
s.add(new P("a"));
System.out.println("-------------");
s.add(new P("c"));
s.add(new P("b"));
System.out.println(s);
s.add(new P("d"));
System.out.println("-------------");
System.out.println(s);
s.add(new P("e"));
System.out.println(s);
System.out.println(s.contains(new P("d")));
s.remove(new P("a"));
System.out.println(s);
}
}class P implements Comparable<P> {
static int hit; public P(String s) {
super();
this.s = s;
P.hit++;
} String s; @Override
public int hashCode() {
// TODO Auto-generated method stub
System.out.println("hashcode");
return P.hit;
} @Override
public boolean equals(Object obj) {
System.out.println("equals");
P p;
if (obj instanceof P) {
p = (P) obj;
return p.s.equals(this.s);
} else {
return false;
}
} @Override
public String toString() {
// TODO Auto-generated method stub
return s;
} @Override
public int compareTo(P o) {
System.out.println(s + " compareTo " + o.s);
return o.s.compareTo(s);
}}输出结果:
-------------
c compareTo a
b compareTo a
b compareTo c
[c, b, a]
d compareTo b
d compareTo c
-------------
[d, c, b, a]
e compareTo b
e compareTo c
e compareTo d
[e, d, c, b, a]
d compareTo b
d compareTo d
true
a compareTo b
a compareTo a
[e, d, c, b]

解决方案 »

  1.   

    不可以的,具体可以查下,compareTo的底层代码
      

  2.   

    楼主的compareTo都是调用string的compareTo,确切地说去逆向调用。所以你用string的hashcode,equals方法,自然不会对你的compareTo产生什么影响。
      

  3.   

    如果只拿TreeSet来说,不用重写equals。
    因为TreeSet里边的对象都要实现Comparable接口并重写compareTo方法,TreeSet判断元素是否相同以及元素的顺序,都是靠这个方法。
    ps:以HashSet为代表的就要重写hashcode 和 equals 方法。
      

  4.   


    这个描述是对的——TreeSet只涉及Comparable(或者Comparator如果指定了的话)
    但是结论是错的——不用重写equals因为是否写equals,你的着眼点不应当是TreeSet或者别的什么,而应当是P这个class本身
    话说,今后还有什么地方可能会用到P,说不定那时就会同时设计compareTo和equals,而且,即使这个class是独自一人工作的,compareTo = 0 equals = false,难道不觉得很别扭吗。