首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

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

2012-04-15 
使用TreeSet的时候有必要重写元素的equals方法么?我在充当元素的类中重写了hashcode、equals、compareTo,在

使用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(或者……

[解决办法]
其实这种事情,看看源码就知道了。

热点排行