`
changyehappy
  • 浏览: 19224 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Object类的解释(equals,hashcode)

 
阅读更多
equalsobjectreferenceintegerapplicationparameterspublic boolean equals(Object obj)
Indicates whether some other object is "equal to" this one.
The equals method implements an equivalence relation on non-null object references:

//自反性:如果非空引用,那么自己equals自己的话就返回true
It is reflexive: for any non-null reference value x, x.equals(x) should return true.

//对称性:x.equals(y) 那么y.equals(x)
It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.

//传递性:x.equals(y)  y.equals(z)  那么x.equals(z)  为true
It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.

//一致性:x.equals(y)为true  那么x.equals(y) 第n次也应该为true 前题是x  y  没有修改

It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified.
For any non-null reference value x, x.equals(null) should return false.
    The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).

   //我们要overwrite equals 方法  就要overwrite  hashcode方法  因为有相同的equals方法就要有相同的hashcode
    Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
    Parameters:
        obj - the reference object with which to compare.
    Returns:
        true if this object is the same as the obj argument; false otherwise.
    See Also:
        hashCode(), Hashtable







public int hashCode()
Returns a hash code value for the object. This method is supported for the benefit of hashtables such as those provided by java.util.Hashtable.
The general contract of hashCode is:

      //在java应用的执行过程中,对于同一个对象的hashcode方法的多次调用,他们应该返回同样的值(前提的中间没有变化)
      Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.

        //对于两个对象,如果使用equals方法返回true,那么这两个hashcode返回的值必须相同
        If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.

        //对于两个对象,如果使用equals方法比较返回false,那个这两个hashcode返回值可以相同可以不同,如果不相同,那么性能会好些。
        It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.
    As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

    Returns:
        a hash code value for this object.
    See Also:
        equals(java.lang.Object), Hashtable



equals方法的源码

//实际就是地址相同的equals就相同

public boolean equals(Object obj) {
    return (this == obj);
}



//对象名称+返回对象的地址(不一定是真实的内存地址)

public native int hashCode();




理解为什么重写了equals方法就要重写hashcode


我的理解是hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,导致混淆,因此,就也需要重写hashcode。为了保证这种一致性,必须满足以下两个条件:

(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false






分享到:
评论

相关推荐

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

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

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

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

    Java理论与实践:hashCode()和equals()方法

    本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...

    equals与hashCode方法讲解

    equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法...

    equals,hashcode,toString

    `equals()` 方法是Object类中的一个方法,它的默认实现是基于对象的引用进行比较,即比较两个对象是否指向内存中的同一个位置。如果需要自定义对象的相等性比较,例如根据对象的属性来判断两个对象是否相等,那么就...

    java 基础之(equals hashcode)

    `equals()` 方法默认继承自 `Object` 类,它进行的是对象引用的比较,即如果两个对象是同一个实例,那么 `equals()` 返回 `true`,否则返回 `false`。但在实际开发中,我们经常需要重写 `equals()` 方法来实现业务...

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

    Object类是所有Java类的根类,它定义了一些常用的方法,例如equals()、hashCode()、toString()等。本案例代码将详细展示Object类的使用方法,并提供一些实际场景下的案例,以帮助开发者更好地理解和运用这些方法。 ...

    equals与hashCode在实际开发中的重写写法

    默认的 `Object` 类实现是比较两个对象的内存地址,这意味着只有当两个引用指向同一个对象时,`equals()` 才会返回 `true`。在大多数情况下,我们需要根据对象的属性来判断两个对象是否相等。例如,如果有一个 `...

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

    Object 类的 equals 和 hashCode 方法的重要性与实现 在 Java 编程语言中,Object 类是所有类的父类,但是在实际开发中,我们往往需要重写 Object 中的 equals 和 hashCode 方法,以便正确地比较对象的逻辑内容,而...

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

    1. **hashCode()**:这个方法是Object类中的,返回一个整数值,代表对象的哈希码。在Java集合框架中,哈希码用于快速查找对象,特别是在哈希表结构如HashMap中。默认情况下,`hashCode()` 返回对象的内存地址的某种...

    Java中equals,hashcode和==的区别

    默认情况下,equals 方法都是调用 Object 类的 equals 方法,而 Object 的 equals 方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。因此,如果我们想要比较两个对象的内容,我们需要重写 ...

    关于hashCode()和equals()的本质区别和联系

    本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些方法。 hashCode() 方法 hashCode() 方法是 Object 类中的一个方法,它返回对象的哈希码值。哈希码值是一个整数,它...

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

    在Object类中,equals方法的默认实现是使用“==”比较两个对象的内存地址,而不是比较两个对象的内容。因此,在大多数情况下,我们需要重写equals方法,以便比较两个对象的内容是否相等。 重写equals方法需要遵守...

    hashcode()和equals()

    在 `Object` 类中,它的默认实现是基于引用的比较,即如果两个引用指向同一个对象,`equals()` 返回 `true`,否则返回 `false`。在自定义类中,往往需要根据类的具体逻辑重写 `equals()` 方法,以满足业务需求,比如...

    Java_重写equals()和hashCode()

    首先,`equals()` 方法是Object类中的一个基础方法,用于比较两个对象是否相等。默认情况下,它比较的是对象的内存地址,也就是引用是否相同。但在实际开发中,我们往往需要根据对象的内容来判断它们是否相等,这时...

    关于重写equals,hashcode以及compareTo方法!

    equals()方法是Object类中的一个方法,它用于比较两个对象是否相等。然而,它的默认实现是比较对象的引用(地址),而不是比较对象的实际内容。因此,在某些情况下,我们需要重写equals()方法,使其比较对象的实际...

    java中hashcode()和equals()方法详解

    `hashCode()`方法定义于`Object`类中,它是Java语言的基础类,所有Java类都直接或间接地继承自`Object`。`hashCode()`的主要作用在于生成一个整数,这个整数通常用来表示对象的一个哈希值。在Java集合框架中,特别是...

    HashCode的用法详解

    如果我们不重写 hashCode(),那么对象的 hashCode 将会默认使用 Object 类中的 hashCode 方法,这样将会导致对象的存储位置不确定。 例如,如果我们有两个对象,它们的 hashCode 都是 1,那么它们将会被存放在同一...

Global site tag (gtag.js) - Google Analytics