在面试当中经常给问到为何要重写equals 和hashcode ? 在什么情况下要重写
如果只重写 equals 不重写 hashcode 会有什么后果这样的问题 要如何才能回答 才漂亮呢?

解决方案 »

  1.   

    我记得是:当要比较对象的内容而不比较引用时便重写equals方法  但重写equals方法便一定要重写hashcode方法,java机制会在调用equals方法时自动调用hashcode方法
      

  2.   

    重写equals 方法不一定要重写hashcode 吧
      

  3.   

    好像当把对象存入map时会需要重写hashCode
      

  4.   

    个人理解:
    首先:equals方法和hashCode方法都是Object类的方法,在Object类中的equals方法是直接用“==”来比较的,而“==”比较得是引用的地址是否相等,如一个类A的两个实例b、c,在使用b.equals(c)时他比较得是b、c这两个引用的地址(他们是不是指向同一个对象)而不是引用所指向的对象内容,而hashCode方法则是返回该对象的哈希码值,也就是对象再内存中的实际地址值(对象所占内存的首地址);当我们在实际应用中需要根据业务逻辑来对两个对象做相等判断时就不能直接使用Object中定义的equals方法了,所以要重写equals方法,而对于hashCode方法,在javaAPI中有说明,当两个对象使用equals比较相等时总是会返回相同的一个整数值,那么这里既然equals的比较策略以及变了,那hashCode方法当然也不能按照原来的策略来生成hashCode值了,所以也要一通重写了,而如果、这时候不重写hashCode的话,即便你用equals方法比较的到两个对象是相等的结论那你也得不到相同的哈希码,至于什么时候会要求重写这两个方法其实很难说,都是根据业务要球来做。没有必要自己写个测试类来测试System.out.println("123456")这样一句话还要重写equals和hashCode吧。
      

  5.   

    感觉5楼说的不错,我只是说一下自己的理解:首先都是object类的方法,Object类的equals比较的是对象的地址,hashcode则是对象的哈希码值,想set集合添加不同的数据就是重写了这两个方法,要不然每次都遍历原先的set内容,效率太低,还有就是new String("a").equals("a") 返回true,就是String重写equals方法,从而比较内容,最后,两个对象equals相等,hashcode一定相同,hashcode相同,equals不一定相同。
    纯属自己理解,虚心接受指正!!
      

  6.   

    个人感觉equals重写,是站在使用的角度上考虑的:类设计者不希望通过内存地址来比较两个对象是否相等,重写这个equals方法,能够方便的使用Collection<E>操作自定义对象E(Collection中很多方法涉及E.equals()的);而hashCode的重新,是方便Map<K,V>的使用,良好的自定义hashCode,会极大的提高Map的使用效率。为啥说equals重新时,一定要重写hashCode?感觉这么理解不知行不行:既然自定义类重写了equals方法,说明类设计者不希望通过内存地址来比较两个对象是否相等了。而Object的hashCode也是对象的内存地址,既然不希望通过地址比较对象,那么以内存地址作为hashCode也就没有实际使用意义了,索性将自定义对象的hashCode方法也重写了吧!
      

  7.   


    会极大的提高Map的使用效率?why?
      

  8.   


    会极大的提高Map的使用效率?why?
    Map<K,V> map;
    这里K可以是任何对象。如果K为自定对象,没有重写equals,那么这个K,一个对象k1只能作为一个Key使用。当k1对应一个v1放到map里,这个k1除了遍历的取,无法通过某个kn来获取,即使这个kn内容与k1完全相同。
    如果K重写了equals,那么我们可以new个k2,把一些条件设置到k2,从而取出以对象k1放进去的v1了。
    嗯,可以试试一个简单的例子,比如K内只有一个String id属性的简单对象。重写equals和不重写,做几个例子对比下。
      

  9.   

    如果是list的使用,只需要重写equals,hashmap还需要重写hashCode
      

  10.   


    如果是list的使用,只需要重写equals? WhY?
      

  11.   


    如果是list的使用,只需要重写equals? WhY?import java.util.HashMap;
    import java.util.Map;
    public class MyKey
    {    public static void main(String[] args)
        {
            Map<Key, Value> map = new HashMap<Key, Value>();
            Key key1 = new Key("1");
            Value v1 = new Value(1);
            map.put(key1, v1);        Key key2 = new Key("1");
            System.out.println(map.get(key2));//没有重写equals或hashCode,返回null        if (null != map.get(key2))
            {
                System.out.println(map.get(key2).getValue());
            }    }
    }
    class Key
    {    private String id;    public Key(String id)
        {
            this.id = id;
        }    public String getId()
        {
            return id;
        }    @Override
        public boolean equals(Object obj)
        {
            if (obj == null || !(obj instanceof Key) || null == this.id)
            {
                return false;
            }        Key key = (Key) obj;        return this.id.equals(key.getId());
        }    @Override
        public int hashCode()
        {
            return this.id.hashCode();
        }
    }
    class Value
    {    private int value;    public Value(int value)
        {
            this.value = value;
        }    public int getValue()
        {
            return value;
        }
    }
    List你自己试试吧。解答就到这里了,很多基础还是要自己按部就班学习的。