//我有一个List,里面存有自己定义的类型Group
Group group = new Group();
List list = new ArrayList();
list.add(group);
//然后转换到一个Set里面去
Set set = new HashSet(list);
//然后判断group是否在set中
set.contains(group); // 为什么这里每次都得到false?

解决方案 »

  1.   

    我的是true.
      public void test(){
    //  我有一个List,里面存有自己定义的类型Group
       String group = new String();
       List list = new ArrayList();
       list.add(group);
    //   然后转换到一个Set里面去
       Set set = new HashSet(list);
    //   然后判断group是否在set中
       System.out.println(set.contains(group)); // 为什么这里每次都得到false?
      }-------------------------
    console: true
      

  2.   

    package test;
    import java.util.*;public class test3 {
      public test3() {
      }  public static void  main(String[] args){
        String xx = new String("1");
        String yy = new String("2");
        List list = new ArrayList();
        list.add(xx);
        Set set = new HashSet(list);
        System.out.println(set.contains(xx));
        System.out.println(set.contains(yy));
      }
    }——————————————————————————————————
    true
    false
      

  3.   

    不好意思,没有看到你说的Group是自己定义的类型。
    你的问题很简单,就是你的自己定义的类里面没有override :public int hashCode()和public boolean equals(Object t)这两个函数。
      

  4.   

    package test;import java.util.*;
    import java.text.*;
    class Ball{
      
    }public class Untitled4 {
      public static void main(String[] args) throws Exception{
        Ball ball = new Ball();
        List list = new ArrayList();
        list.add(ball);
        System.out.println(list.contains(ball));
        
        Set set = new HashSet(list);
        System.out.println(set.contains(ball));
      }
    }返回两个truefaen(发恩):你说的是不必要的,如果没有orerride equals和hashCode,就会使用Object的版本,是可以工作的。只不过Object的版本使用的是最为严格的比较:内存地址。
      

  5.   

    chongkai() : 我说的是实用的,你没有覆盖当然可以运行,可是谁会有这样的逻辑
      

  6.   

    faen(发恩):当然有这样的逻辑,就楼主的这个问题,你说的东西是不必要的。只有在必要的时候,才需要覆盖equals和hashCode。
      

  7.   

    如果我没记错的话,TIJ中说到String可以平滑过度,没有任何错误,而其他的都需要重写hashCode和equals
      

  8.   

    我来解释一下Object的hashCode返回值基本上是对象的内存地址Object的equals方法判断两个Object对象是否“相等”的依据其实是两个对象是否“相同”所以,如果obj1 和 obj2 都是Object实例,那么 obj1.equals(obj2) 和 obj1 == obj2 是等价的equals和hashCode这两个方法的关系是:如果两个对象equals返回true,那么它们的hashCode必须返回相同的integer值。反之,则不做要求,但建议是:如果它们返回相同的hashCode,那么equals应该返回true。因为上面的原因,如果某个类覆盖了Object的equals方法,那它就必须覆盖hashCode方法,以满足上述要求。对于自己定义的类,是否要覆盖这些方法,完全取决于自己的需要,如果需要放宽两个对象相等的条件,就需要覆盖。如果不需要,就用Object的实现好了,完全没有问题。例如,对于Integer类,它需要将两个Integer相等的条件放宽到只要它们包含的数值相等,两个对象就相等,它就会覆盖equals方法,同时,它必须覆盖hashCode方法,返回值很简单,就是它包含的整型值。再例如,Thread类就没有覆盖这两个方法,它作为Object的直接继承,写Thread类的人认为继承使用Ojbect的这两个方法是合适的,他就不会去覆盖。