本帖最后由 Ark_Xu 于 2010-07-01 00:03:12 编辑

解决方案 »

  1.   

    1.equals 一般只考虑同一类的对象值相等是否相等 依需求定 是引用相等 只需要=
    2.getClass()  返回的是 类类型 根据第一点所以要先判断 这两个类是不是同一类
    3.instanceof 有点耗资源 如果用 getClass().toString() 就可以判断最好
    4.如果子类可以跟父类比较 那么要用getClass().toString() 判断是否是父子关系
    5.这个主要用于不可以存储重复对象的集合是 才覆写hashCode 方法。重复对象 是用equals 判断的
    equals 一般用于判断对象值是否想等 在集合里面会用特殊的算法形成值 而这个算法用到了hashCode 方法
      

  2.   

    第5点我也暂时说不清 应该这么理解
    5.这个主要是因为该类会用于不可以存储重复对象的集合的时候. 重复对象的判断用到了equals 和hashCode 方法。
      

  3.   

    使用instanceof的例子中,父类对象和子类对象相互equals看看,不满足equals的约定
      

  4.   

    建议读一下effective java这本书,有一节专门讲这些问题
      

  5.   

    如果重新定义 equals 方法 就必须重新定义 hashCode 方法2楼解释了,
    hashSet和hashMap都是根据计算对象的hashcode来确定对象位置的,
    1、计算两个对象的hashcode,如果相等,转2,如果不等,直接放入
    2、判断两个对象equals,返回true,抛弃掉,返回false,放入如果你只重写equals而不重写hashcode的话,就会发现很多业务上的BUG
      

  6.   

    不知道为什么LZ要重写equals();呢?
      

  7.   

    effective java里面写的很好,改写equals应该注意的一些地方,建议看下~
      

  8.   

    能不能顺便问一下hashCode一般应该怎么写?
      

  9.   

    楼上都解释了hashcode和equals了
    还是蛮好的
    至于这么写hashcode  你覆盖Obeject中hashcode方法就行了,但在Collection中一定要注意:尽量做到
    随即,不聚集!
      

  10.   

    假设有一个 Employee 类 Mannger 类继承了它
    这时候子类和超类的对象 getClass 相等么
      

  11.   

    equals 这是API里说的:
    equals 方法在非空对象引用上实现相等关系: 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。 
    对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。 
    传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。 
    一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。 
    对于任何非空引用值 x,x.equals(null) 都应返回 false。 
    equals() 表示是意思是 是否相等。他表示的是在逻辑层面上的相等,和唯一。 
    hashcode() 返回该对象的哈希码值,他被用在凡是利对象hash特性的实现上,比如HashMap,HashSet 等。他可以提高效率。
    API 中是这样说的:
    hashCode 的常规协定是: 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 
    如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 
    如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 

    所以他们都表示对象的唯一性,只过是在不同的层面上而以,但唯一性都是一致的,统一的。
    所以一般在重写 equals ,也要重写 hashCode。