在看到set这部分了,书中说set为了防止元素的重复,必须得为元素定义equals()方法,但是,给的例子确实这样的: //: c11:Set2.java
// Putting your own type in a Set.
import com.bruceeckel.simpletest.*;
import java.util.*;public class Set2 {
  private static Test monitor = new Test();
  public static Set fill(Set a, int size) {
    for(int i = 0; i < size; i++)
      a.add(new MyType(i));
    return a;
  }
  public static void test(Set a) {
    fill(a, 10);
    fill(a, 10); // Try to add duplicates
    fill(a, 10);
    a.addAll(fill(new TreeSet(), 10));
    System.out.println(a);
  }
  public static void main(String[] args) {
    test(new HashSet());
    test(new TreeSet());
    test(new LinkedHashSet());
    monitor.expect(new String[] {
      "[2 , 4 , 9 , 8 , 6 , 1 , 3 , 7 , 5 , 0 ]",
      "[9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 ]",
      "[0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]"
    });
  }
} ///:~该例子把MyType 这种类型的元素放入set中,mytype是书中前面定义的,只是实现了comparable接口的compareTo()方法, 没有定义equals().
这是不是说equals()方法可以用comparable接口的compareTo()方法来代替?

解决方案 »

  1.   

    答:Set为无序,并且不可重复的集合类,这里的重复是这样的:如果两个对象相互equals()的话,就说明这两个是重复的。实现Comparable接口的compareTo()方法以后,该对象之间就可以想普通数据类型一样相互比较大小了。
      

  2.   

    楼上的正解
    由于set自己有一套内置的排序机制,
    所以如果要将自己创建的类加入set集合,必须实现Comparable接口.
      

  3.   

    可能是我没把问题问清楚,tij中说,如果是自己的类,要想放入set中,必须得有equals()方法,可为何上面那个例子并没有equals(),也能运行,为何?
      

  4.   

    lz的意思我明白了,是这样的:set在比较其中的元素是否相等的时候是比较hashcode的,所以我们经常要复写equals()和toString()方法了实现改变hashcode的目的.而对象实现了comparable接口的compareTo()方法在做比较的时候会按照compareTo()方法中规定的比较方法来比较两个对象是否相等.而不是按照hashcode来比较了.所以如果我们想让比较两个对象是否相等时不让hashcode来参与,大可实现comparable接口,如果我们仅仅时想改变一下hashcode的值可以复写equals()和toString()方法.
      

  5.   

    谢谢你的回复,你的意思是说set中的元素只要有办法来区分是否相等就可以了,既可以用实现comparable接口的compareTo(),也可以复写equals().两种方式,自己挑一种就可以了,是这样吗?谢谢
      

  6.   

    楼上说的对,equles和compareto用哪一个看比较的数据类型,equles不重写就是“==”比较的是地址。
      

  7.   

    楼主被人给涮了。不同的set使用的是不同的。
    HashSet比较的是hash值。需要复写对象的hash算法。TreeSet是使用compare建立树,要求对象实现Comparable接口。