书上说两个对象equals,必须hashCode也相等。一个例子:
class Forest1{ 
 private String name; 
 public Forest1(String name){this.name = name;} 
 public boolean equals(Object p){ 
   return ((Forest1)p).name.equals(this.name); 
  } 

public class Forest{
 public static void main(String [] args){
 Forest1 f1 = new Forest1("abc");
 Forest1 f2 = new Forest1("abc");
 System.out.println(f1.hashCode());
 System.out.println(f2.hashCode());
 System.out.println(f1.equals(f2));
 }
}这里f1和f2的hashCode不相同,为什么f1..equals(f2)确实true?哪位大神解释下

解决方案 »

  1.   

    “书上说两个对象equals,必须hashCode也相等”这句话的意思是让您来实现这个标准。
    您目前Forest1这个类需要override hashCode()。
      

  2.   

    hashCode是唯一标识一个对象的编码.f1 equals f2是因为他们两个的name属性指向了同一个内存区域("abc"),但是f1与f2却是两个不同的对象,有着不同的内存区域  (个人见解)
      

  3.   

    回楼上 默认二者哈希码不一样,两者无法放到同一个哈希桶 那如何比较是否equals呢?
      

  4.   

    谁说equals=true,hashcode一定必须要相等的?
    最多只能算个规定,规范。当然最好是要遵守这个规范,不然当这个对象涉及到hashcode相关操作就会出问题。比如HashMap
      

  5.   

    重写equals方法必须重写hashcode的   你只是重写了equals方法  按你重写的equals那样肯定返回TRUE啊  你应该重写hashCode()方法  @Override
     public int hashCode(){
     int result = 17 ;
     result = 37*result +name.hashCode();
    return result;
     
     }
      

  6.   

    我突然想会不会hashcode只被一些集合类使用了?普通的equals比较无视hashcode?
      

  7.   

    hashCode相同,一定equals.但是equals不一定hashCode相等啊,所以为了统一,对于equals的两个对象,我们要保证两者的hashCode相同.  你重写 的equals方法就是判断他们是否equals,
      

  8.   

    首先在类中equals及hashCode必须同时重写,其次才是equals 为true,那么hashCode必须相等,equals为false,对hashCode没有要求。
    首先条件不满足,产生的结果是不可预知。
      

  9.   

    你单调用equals方法,与hashCode有毛关系啊如果你用这个类的对象作为hashmap的key再试试,看看能不能取出存进去的对象
      

  10.   

    你重写了equals方法,用的是两个字符串的equals;而字符串的equals只要值相等就是true;跟hashcode无关的
      

  11.   

    至于LZ说的
    书上说两个对象equals,必须hashCode也相等。:
    这只是一个约定,不遵守并不影响程序运行;
    只是在某些运用上需要注意
    比如HashMap中put 和get都是比较key的hashcode
    而HashSet比较的是equals