`

java里中equals, hashCode,toString的作用

阅读更多

对于一般的java值对象或实体对象来说, 这三个方法总是应该覆盖的
equals, hashCode, toString, 所以我总是把值对象从下面这个类继承

public abstract class BaseObject implements Serializable {
    /**
     * DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public abstract String toString();

    /**
     * DOCUMENT ME!
     *
     * @param o DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public abstract boolean equals(Object o);

    /**
     * DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public abstract int hashCode();
}

1. equals(), 有如下要求
* Symmetry 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。 
* Reflexivity反射性:x.equals(x)必须返回是“true”。 
* Transitivity传递性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。 
* Consistency一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。 
* 还有就是x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。

2. hashCode()的返回值和equals()的关系如下:
* 如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。 
* 如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。


关于hashCode到底怎么写最好, 关系到hash算法的原理, 算法导论中有详细论述,
Effective Java中也给出了一个指导意见

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. If the field is an object reference and this class’s equals method
compares the field by recursively invoking equals, recursively
invoke hashCode on the field. If a more complex comparison is
required, compute a “canonical representation” for this field and
invoke hashCode on the canonical representation. If the value of the
field is null, return 0 (or some other constant, but 0 is traditional).

vii. If the field is an array, treat it as if each element were a separate field.
That is, compute a hash code for each significant element by applying
these rules recursively, and combine these values per step 2.b. If every
element in an array field is significant, you can use one of the
Arrays.hashCode methods added in release 1.5.

b. Combine the hash code c computed in step 2.a into result as follows:
result = 31 * result + c;

3. toString()
总可以由这个方法的返回值知晓对象的状态

分享到:
评论

相关推荐

    equals,hashcode,toString

    在Java编程语言中,`equals()`, `hashCode()` 和 `toString()` 是三个非常重要的方法,它们主要用于对象的比较、哈希存储以及打印对象信息。这三个方法是Java对象的基础特性,对于理解和开发高质量的Java程序至关...

    java中Hashcode的作用.docx

    "Java中Hashcode的作用" Hashcode是Java编程语言中一个非常重要的概念,它在equals方法中扮演着关键角色。在Java中,每个对象都具有一个独特的Hashcode,它可以用来标识对象的身份。但是Hashcode是什么?它是如何...

    TEH:Java Tostring Equals Hashcode with annotations

    TEH 使用注解来实现 toString、equals 和 hashCode,并强制执行这 2 条规则 任何用于 hashCode 的属性都将用于 equals 和 toString 用于 equals 的任何属性都将用于 toString 注释是 @ToString @ToStringEquals ...

    hashCode的作用

    `hashCode`方法是`java.lang.Object`类中的一个方法,所有Java类都继承自`Object`类,因此每个Java类都有`hashCode`方法。该方法返回一个整数,通常是对象的哈希值。哈希值是根据对象的内容计算出来的。 #### 2. ...

    java中重写equals()方法的同时要重写hashcode()方法(详解)

    Java 中重写 equals() 方法的同时要重写 hashCode() 方法的重要性 在 Java 中,equals() 方法和 hashCode() 方法是两个紧密相关的方法,它们都是用于比较和标识对象的方法。equals() 方法用于比较两个对象的值是否...

    Java的Object类讲解案例代码 equals()、hashCode()、finalize()、clone()、wait()

    这个源码资源是关于Java中的Object类的讲解案例代码。Object类是所有Java类的根类,它定义了一些常用的方法,例如equals()、hashCode()、toString()等。本案例代码将详细展示Object类的使用方法,并提供一些实际场景...

    JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)

    ### Java 高级特性详解 #### 一、`hashCode` ...正确地重写 `equals` 和 `hashCode` 方法、使用 `Comparator` 进行排序、利用反射机制和序列化技术,以及实现 `clone` 方法都是开发高质量 Java 应用程序的重要技能。

    EqualsHashCodeToStringBuilders-Java8:等于,使用Lambdas,Java8的HashCode和ToString Builder

    等于,HashCode和ToString构建器使用Java8实现Equals,HashCode和ToString Builder。建立资讯使用Gradle 2.0进行构建。 请不要签入Eclipse或Intellij或任何特定于IDE的文件。 对于Idea或Eclipse,可以使用以下命令...

    Java toString的性能优化方案比较

    谁在关心toString的性能?没有人!除非当你有大量的数据在批量处理,使用...我们所钟爱的IDE们常常为我们生成equals/hashcode/toString这些方法,且我们通常不再去管它们。此外,这些IDE们提供了许多方式来生成我们自己

    Java Object类认识

    本文将深入探讨`Object`类,以及其核心方法`equals()`与Java中的`==`操作符之间的差异。 `Object`类位于Java的核心库`java.lang`包中,它提供了基本的方法来支持对象的创建、比较和字符串表示。以下是`Object`类的...

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

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

    java课件 常用类与异常处理

    在Java中,`Object`类是所有类的父类,它提供了几个核心的方法,包括`equals()`, `hashCode()`, 和 `toString()`。 `equals()`方法用于比较两个对象是否相等。默认实现比较的是对象的引用,即两个对象是否指向内存...

    Java基础入门一.pdf

    java.lang.Object类是所有Java对象的根类,它提供了许多基础方法,如getClass、hashCode、equals、toString、clone、finalize、notify、notifyAll和wait,这些方法定义了Java对象的基本行为。 集合框架(Collection...

    dart_dataclass:Dart 数据类(equals、hashCode、toString、copyWith)方法生成器

    hashCode 字符串 复制与 入门 0. 将依赖添加到 pubspec.yaml dependencies : dataclass : latest_version dev_dependencies : dataclass_generator : latest_version 1. 用@dataClass 注释你的类 班级应该: ...

    Java源码解析——看优秀源码最能使人进步

    Java.lang.Integer类是Java语言中的一种基本数据类型,该类的声明、主要属性、构造方法、toString方法、自动拆箱和装箱、equals方法、hashCode方法、parseInt方法、compareTo方法等都会被详细解析。 Java.lang....

    java se1 学习

    Object类提供了几个基本的方法,如toString()、equals()和hashCode()。toString()方法用于生成表示当前对象状态的字符串,通常在打印或调试时使用。默认的toString()返回的是对象的类名加上@符号和对象的哈希码。...

    java的各种类库 java包

    Lombok则是用于简化Java代码的工具,通过注解处理器自动添加getter、setter、equals、hashCode和toString方法,减少冗余代码。 还有JUnit用于单元测试,Mockito用于模拟对象,以及Spring Boot,它使得创建独立的、...

    java中object类实例分析

    在Java中,hashCode方法是Object类中的一个重要方法,它是所有Java类的父类。 toString方法是返回对象的字符串表示的方法。它可以将对象的属性转换为字符串,以便于程序内查看对象属性和调试代码。 在Java中,...

    eclipse整合lombok文档

    它可以自动为 Java 类生成 getter、setter、equals、hashCode、toString 等方法,从而提高开发效率。 Eclipse 整合 Lombok 要在 Eclipse 中整合 Lombok,需要进行以下步骤: 1. 下载 Lombok 的 Jar 包,地址是 ...

Global site tag (gtag.js) - Google Analytics