`
withoutme_hw
  • 浏览: 9649 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Item 9: Always override hashCode when you override equals(Effective Java Chapter2笔记)

 
阅读更多
1.You must override hashCode in every class that overrides equals.
如果一个类实现了equals方法却没有实现hashCode方法,那么将这个对象A放入HashMap中,然后new一个与A相等的对象B,在HashMap中查找B,返回值将是null,因为没有实现hashCode方法,导致相等的两个对象返回的hash值不同(因为A==B为false)。
2.JavaSE6中关于hashCode方法的约定:
1)在应用的一次运行过程中,每一次调用hashCode方法的返回值必须是同一个整数,除非equals中使用到的值被改变。
2)如果两个对象调用equals返回true,那么他们的hashCode必须一样
3)如果两个对象调用equals方法返回false,不要求hashCode返回值必须不一样,但是如果返回的值不一样会提高hash tables的性能。
3.hashCode method recipe:
1. Store some constant nonzero value, say, 17, in an int variable called result.
2. For each significant field f in your object (each field taken into account by the equals method, that is), do the following:
a. Compute an int hash code c for the field:
i. If the field is a boolean, compute (f ? 1 : 0).
ii. If the field is a byte, char, short, or int, compute (int) f.
iii. If the field is a long, compute (int) (f ^ (f >>> 32)).
iv. If the field is a float, compute Float.floatToIntBits(f).
v. If the field is a double, compute Double.doubleToLongBits(f), and then hash the resulting long as in step 2.a.iii.
vi. 如果域是一个对象,则递归的调用hashCode,如果对象为null,返回0.
vii.如果是一个数组,把数组中的元素当做一个独立的域。如果数组中的每个元素都很重要,则使用Arrays.hashCode方法。
b. Combine the hash code c computed in step 2.a into result as follows: result = 31 * result + c;(选择31的原因:素数,且31 * i = (i << 5) - i,代码中无需这么写,因为JVM会自动优化)
4.return result
5.检查hashCode方法是否满足第2点中的约定。
4.为了提高效率,对于频繁调用的hashCode方法,可以将对象的hash值缓存起来
5.Do not be tempted to exclude significant parts of an object from the hashcode computation to improve performance.
有可能,大量的对象仅仅靠被你忽略的域来区分,这样HashMap中的数据会集中在一起。
Item 10: Always override toString
1.toString方法无需向equals和hashCode方法那样严格遵守约定,但是提供一个好的toString方法会使程序用起来很方便。
假设有一个PhoneNumber类,未实现toString方法,那么System.out.println("Failed to connect: " + phoneNumber);这样代码的结果很可能会是这样:{Jenny=PhoneNumber@163b91},无法提供充分的信息。

2.在实现toString方法时,一个重要的决定是要不要指定toString返回值的格式。The advantage of specifying the format is that it serves as a standard,unambiguous, human-readable representation of the object.可以很容易的在字符串和类之间相互转化。缺点是如果指定了格式标注,那么大量的客户端代码可能会依赖这个格式,所以这个格式将有可能永远不能再修改。Whether or not you decide to specify the format, you should clearly documentyour intentions.

3.Whether or not you specify the format, provide programmatic access to allof the information contained in the value returned by toString.如果没有提供,那么会强迫客户端转化字符串来获取对象的域,这将可能带来很多潜在的错误。
分享到:
评论

相关推荐

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 11: Always override hashCode when you override equals Item 12: Always override toString Item 13: Override clone judiciously Item 14: Consider implementing Comparable 4 Classes and Interfaces Item...

    HashCode相同equals不同的2位字符集合算法

    在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...

    Java重写equals及hashcode方法流程解析

    "Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object类中的方法。在实际开发中,正确地重写这两个方法对于确保程序的正确性和性能至关重要。下面,我们将...

    重写equals方法

    在 Java 中,equals 方法是一个非常重要的方法,它用于判断两个对象是否相等,而不是判断两个对象的引用是否相同。在 Object 基类中,equals 方法的实现是使用“==”操作符来比较对象的引用,但是这并不满足实际需求...

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

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

    关于Object中equals方法和hashCode方法判断的分析

    "关于Object中equals方法和hashCode方法判断的分析" 在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。...

    java中hashCode方法与equals方法的用法总结

    在Java编程中,`hashCode()` 和 `equals()` 方法是对象比较和哈希表操作的关键组成部分。首先,我们来看一下这两个方法的基本概念。 `equals()` 方法是 Object 类的一个成员方法,用于比较两个对象的内容是否相等。...

    java学习equals

    在Java编程语言中,`equals()`方法是一个非常关键的概念,特别是在处理对象的比较时。`equals()`方法默认是由Object类提供的,它用于比较两个对象是否相等。在"java学习equals"这个主题中,我们将深入探讨`equals()`...

    Java面试宝典Beta6.0.pdf

    本节课主要讲解Java基础知识,包括跨平台性、逻辑运算符、构造器、break、continue、return语句、equals和hashCode方法、String类继承、值传递和引用传递等内容。 1. 跨平台性 Java语言编写的程序,一次编译后,...

    java中List对象列表实现去重或取出及排序的方法

    在Java中,想要去重List对象列表,首先需要重写实体类的equals和hashCode方法。equals方法用于比较两个对象是否相同,而hashCode方法用于计算对象的哈希码值。 例如,假设我们有一个Student类,想要去重Student对象...

    Java hashCode() 方法详细解读

    Java中的`hashCode()`方法是基于对象的内部状态计算出的一个整数值,它在处理集合特别是HashSet、HashMap等基于哈希表的数据结构时起着至关重要的作用。哈希码(Hash Code)被用来快速定位对象在哈希表中的位置,...

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

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

    java 面对对象编程.pdf.zip

    为什么重写 equals() 时必须重写 hashCode() 方法? String String、StringBuffer、StringBuilder 的区别? String 为什么是不可变的? 字符串拼接用“+” 还是 StringBuilder? String#equals() 和 Object#equals() ...

    李星华老师讲解java常见面试题笔记

    13. 防止Set中的元素重复:Set中元素不重复是通过equals()和hashCode()方法实现的。equals()用于判断两个对象是否相等,而==比较的是对象的引用。 14. 常见的运行时异常:例如NumberFormatException(解析数字时...

    java面试题.pdf

    2. equals() 和 hashCode() 之间的关系:equals() 方法用来比较两个对象是否相等,hashCode() 方法用来生成对象的哈希码,两个对象的哈希码相同不一定相等。 3. final 关键字的作用:final 关键字用于修饰变量、方法...

    java集合知识-map、set等

    是通过对象的hashCode和equals方法来完成对象唯一性的。 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。 ...

    Java常见面试50题(java+jsp)

    14. Set中的元素去重:Set依赖于hashCode()和equals()方法判断元素是否重复,不使用==进行比较。==比较的是对象引用,而equals()比较的是对象内容。 15. 常见的RuntimeException:例如NumberFormatException、...

    effectice_java第二版 英文

    9. **条目9:谨慎地覆盖clone(Override clone judiciously)** clone()方法可能存在复杂性和陷阱,除非有必要,否则应避免覆盖。 10. **条目10:优先考虑使用枚举而非int常量(Use Enums Instead of Int ...

    Java基础笔记需要的可以看看.docx

    2. **数据类型转换**:Java 支持自动类型转换(从小到大,如 int 到 double)和强制类型转换(从大到小,如 double 到 int,需要加上 `(int)`)。 3. **主流数据库**:SQL Server 主要用于Windows,简单易用;...

    Java学习笔记,面向对象深化

    因此,所有Java对象都有`Object`类提供的方法,如`toString()`、`equals()`和`hashCode()`。 5. **`toString()`方法**: - `Object`类的`toString()`方法返回类名加`@`加16进制的哈希码。在打印或连接对象时,默认...

Global site tag (gtag.js) - Google Analytics