当前位置: 代码迷 >> J2SE >> 使用TreeSet的时候有必要重写元素的equals方法么?解决方法
  详细解决方案

使用TreeSet的时候有必要重写元素的equals方法么?解决方法

热度:109   发布时间:2016-04-24 01:21:20.0
使用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(或者……

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