日期:2014-05-20  浏览次数:20966 次

使用TreeSet的时候有必要重写元素的equals方法么?
我在充当元素的类中重写了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 方法。
------解决方案--------------------
探讨

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

------解决方案--------------------
探讨

引用:

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


这个描述是对的——TreeSet只涉及Comparable(或者……

------解决方案--------------------
其实这种事情,看看源码就知道了。