`
skzr.org
  • 浏览: 367196 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

对于所有对象都通用的方法equals、hashCode

    博客分类:
  • J2EE
阅读更多

呵呵再补充下,摘录自我的wiki(读

笔记):

 

 

对于所有对象都通用的方法

 

  • Object中的方法:equals,hashCode,toString,clone 和 finalize都有明确的通用约定,所以我们需要遵守,因为不少的类都是按照通用约定来工作的

 

覆盖equals时请遵守通用约定

 

  • 覆盖equals方法有讲究的
  • 一下任意条件满足,都不应该覆盖equals
    1. 类的每个实例本质上都是唯一的,如:Thread
    2. 不关心类是否提供了“逻辑相等”的测试功能:如java.util.Random.equals
    3. 超类已经覆盖了equals,并且子类认为是合适的,如:Map的equals实现继承了?AbstractMap.equals,List的equals实现继承了?AbstractList的equals

  • 类是私有的或是包级私有的,可以确定永远不会被调用equals方法: 需要覆盖equals:throw new ?AssertionError("不要调用我");

  • 如果类有自有的“逻辑相等”就需要覆盖equals方法了
  • equals通用约定:
    1. 自反性:对于任何非空x,x.equals(x)==true
    2. 对称性:对于任何非空x、y,x.equals(y)==y.equals(x);
    3. 传递性:对于任何非空x、y、z,如果x.equals(y)==true、y.equals(z)==true那么x.equals(z)==true;
      1. java.sql.Timestamp和java.util.Date的问题:"鉴于 Timestamp 类和上述 java.util.Date 类之间的不同,建议代码一般不要将 Timestamp 值视为 java.util.Date 的实例。Timestamp 和 java.util.Date 之间的继承关系实际上指的是实现继承,而不是类型继承。"
    4. 一致性:只要x、y没有修改过,那么每次执行x.equals(y)都获得相同的结果
      1. java.net.URL.equals的调用依赖于网络,每次调用它们的内在可能变化
    5. 对于非空x: x.equals(null)==false
  • 高质量的equals方法
    1. 使用==检查参数是否为这个对象的引用:if (o == this) return true;
    2. instance of进行类型检查
    3. 把参数转化为正确的类型
    4. 每个关键域检查它们是否匹配
      1. 非float和double的基本类型直接==比较
      2. float使用Float.compare比较
      3. double使用Double.compare比较
      4. 对于对象引用直接调用equals比较
      5. 如果是数组域,如果每个元素都是关键域,那么每一个都要比较,jdk1.5后可以通过Arrays.equals解决
    5. 注意比较顺序带来的性能影响:最易变的先比较
    6. 写完equals问问:是否对称、传递、一致
      1. 覆盖equals时总要覆盖hashCode
      2. 不要企图让equals过于智能
      3. 不要讲equals中的参数替换为其他类型,这不是覆盖而是重载,所以需要@Override注解

 

覆盖equals时总要覆盖hashCode

 

  • hashCode 的常规协定是:
    1. 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
    2. 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
    3. 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
  • hashCode生成简单办法:计算所有的关键域,排除可由其他关键域计算得到的域
    1. 把非0的常数值保存到result中,如17
    2. 对于每一个关键域f(equals中涉及的每个域),完成以下步骤:
      1. 为该域计算int型散列码c:
        1. boolean return f?1:0
        2. byte、char、sort或int return f;
        3. long return (int)(f^(f>>>32))

        4. float return Float.floatToIntBits(f)
        5. double return Double.doubleToLongBits(f)再作为long型来计算散列值
        6. 引用对象return null?0:f.hasCode();
        7. 如果是数组,递归处理每一个元素
      2. 合并result = 31 * result + c
分享到:
评论

相关推荐

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    重写equals方法需要遵守通用约定,hashCode方法的实现需要保证equals相同的两个对象的hashCode结果一致。ArrayList、Vector和LinkedList是Java中三种常见的容器集合,每种集合都有其特点和应用场景。

    注意对象的通用方法,类的设计陷阱.pdf

    对象的通用方法通常指的是所有对象都可以调用的方法,如`toString()`、`equals()`、`hashCode()`等。这些方法定义在`java.lang.Object`类中,是所有Java类的超类。了解并正确使用这些通用方法对于编写高质量的Java...

    详解hashCode()和equals()的本质区别和联系

    在 Java 中,hashCode() 和 equals() 是两个非常重要的方法,它们都是从 Object 类继承来的。了解这两个方法的本质区别和联系对于 Java 开发者来说至关重要。 equals() 方法 equals() 方法是 Object 类提供的一种...

    学习Object类——为什么要重写equeals和hashcode方法

    此外,Object 类的设计是为了扩展,它提供了一些非 final 方法,如 equals、hashCode、toString、clone 和 finalize,这些方法都有通用的约定,需要在子类中被覆盖(override)。如果不遵守这些约定,依赖这些约定的...

    《面向对象技术与方法》09、继承与多.pdf

    Object类通常定义了一些通用的方法,如toString()、equals()、hashCode()等,这些方法在进行对象操作时非常有用。 ### 综合运用继承与多态性 在实际的软件开发中,合理地运用继承和多态性可以显著提升代码的复用性...

    java中equals和==的区别.pdf

    在Java编程语言中,`equals()`方法和`==`运算符是两个经常用来比较对象的...同时,为了确保其他自定义类的`equals()`方法正确实现,应遵循通用约定,即同时重写`equals()`和`hashCode()`方法,以保持一致性和正确性。

    Java中Equals使用方法汇总

    在Java中,正确使用和重写`equals`方法对于比较对象和在数据结构中查找对象至关重要。遵循通用约定和同时更新`hashCode`方法能确保一致性和正确性。通过理解和实践这些原则,开发者可以创建出更可靠、更具可维护性的...

    根据Model类自动生成

    总的来说,这个话题涉及了代码生成、面向对象编程原则、Java编程中的Equals和HashCode方法、以及可能的数据库交互。理解并熟练使用这样的工具对于提升开发效率和代码质量都大有裨益。在实际应用中,开发者可以自定义...

    Java实训教程 Java软件开发实战 Java类库 第1章 Object类 共29页.pptx

    因此,当重写`equals`方法时,通常也需要重写`hashCode`方法,确保两个`equals`结果为真的对象具有相同的哈希码。 #### 六、`toString`方法详解 - `toString`方法返回对象的字符串表示形式,默认情况下,`Object`...

    Java程序设计:020611_Object类.ppt

    - Object类提供了对所有Java对象通用的基本操作,例如`clone()`,`finalize()`,`hashCode()`等。这些方法使得在处理不同类型的对象时有一致的行为。 - Object类的`toString()`方法是一个关键的方法,它返回一个...

    JAVA对象以及数据的工具类

    此外,Objects类(在Java 7引入)提供了equals、hashCode和requireNonNull等方法,增强了对象比较和非空检查的功能。 数据处理工具类往往涉及集合操作。Java的util包包含了多种集合框架类,如List、Set、Map等。...

    对象转型和多态1

    1. **equals()方法**:默认情况下,equals()方法用于比较两个对象的引用是否相等,即是否指向内存中的同一位置。然而,许多类如String重写了equals()方法,以比较对象的值是否相等。例如: ```java String s1 = ...

    Java语言程序设计抽象类和接口PPT教案学习.pptx

    Object类提供了基本的方法成员,如toString()、equals()、hashCode()等,所有类都继承了这些方法。 Object的方法成员 ----------------- Object类只有少数几个方法成员,它们是: * toString():返回描述对象的...

    面向对象OO程序设计概念PPT课件.PPTx

    **Java中的Object类**:在Java中,所有类都直接或间接地继承自Object类,它提供了所有Java对象通用的行为,如toString()、equals()和hashCode()等方法。通过继承,我们可以为特定类添加额外的功能,同时保持与Java...

    高效Java 第三部分,经典的国外教材

    ### 高效Java第三部分:经典教材中的对象通用方法详解 #### 一、引言 在Java编程语言中,`Object` 类作为所有类的基类,提供了几个重要的非 `final` 方法,如 `equals()`、`hashCode()`、`toString()`、`clone()` ...

    java-object类

    2. **提供通用方法**:`Object` 类定义了一些非常重要的方法,如 `equals()`、`hashCode()` 和 `toString()`,这些方法在几乎所有 Java 类中都有应用。 3. **支持多态性**:通过继承 `Object` 类,Java 支持多态性,...

    JavaSE进阶-01-面向对象.pdf

    - 所有Java类都默认继承自Object类,Object类提供了所有对象通用的方法,如`toString()`、`equals()`、`hashCode()`等。 6. **package和import**: - Package是Java中的命名空间,用于组织类,避免命名冲突。...

    java中的Object类[文].pdf

    这个类包含了所有对象通用的基本方法,例如`equals()`、`hashCode()`、`toString()`以及`clone()`等。在Java中,`native`关键字用于标记一个方法的实现是在Java之外的代码中,通常是用C或C++实现的,这些方法通过...

    java容器(持有对象)

    在使用这些容器时,对于自定义对象,为了正确实现equals()和hashCode()方法,以确保在Set或Map中正确识别对象,通常需要重写这两个方法。此外,处理多线程环境时,需注意线程安全问题,某些容器如ArrayList和HashMap...

Global site tag (gtag.js) - Google Analytics