我在充当元素的类中重写了hashcode、equals、compareTo,在里面加上输出语句。然后调了几个TreeSet的方法进行操作,只有compareTo方法被执行过,由此能不能断定可以不重写equals?
- Java code
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]
------解决方案--------------------
如果只拿TreeSet来说,不用重写equals。
因为TreeSet里边的对象都要实现Comparable接口并重写compareTo方法,TreeSet判断元素是否相同以及元素的顺序,都是靠这个方法。
ps:以HashSet为代表的就要重写hashcode 和 equals 方法。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
其实这种事情,看看源码就知道了。