`

对于JAVA中equals方法的探讨

 
阅读更多

 

 

    最近遇到了许多关于equals(Object o)方法的探,个人觉得有必要在这里总结一下,以备哪时忘了,好翻下。

 

首先我们来说下Object.equals(Object o),提供的初忠是为了比较两个对象是不是同一个引用。而不是比较是不是同样的值。例如如下代码:

          A a = new A();

          A a2 = new A();

          a.equals(a2);

这里的equals方法将返回一个false;因为这两个对象不是同一个对象,所以指向的是不同的引用。若改为:

         A a = new A();

          A a2 = a;

          a.equals(a2);

那么这里则返回一个true。因为这里两个对象指向了同一个引用。这里需要注意的一个地方,就是这里的equals方法和==比较是同样的,都是比较两上对象是否是是同样的引用。

 

String 的equals方法,是重写了Object的equals方法,比较的是两个字符串对象,是不是相同的值。而==是比较两字符串的引用是否相等。来看个实例:

String a = new String("aaa");

String a1 = new String(:"aaa");

在这里,a==a1为false,a.equals(a1)为true,这个和上面是印证的。equals比较的是两个对象中是否存在同样的值,而不是同样的引用。所以equals返回为true,==则返回false.

接下来,我们改动一下代码为如下:

String a = "aaa";

String a1 = "aaa";

现在再去比较,发现不一样了呢?这是为什么呢?其实这个是因这里定义的String对象,是用了两个同样的引用了,当你定义前一个a对象时,JAVA就在常量池中创建了一个内容为“aaa”的常量,然后创a1时,则先查找常量池中有没有“aaa”的常量,如果有,则直接引用,没有再创建。这种方式创建的两个对象,equals和==都返回的是TRUE.这下应该明白了吧?那再改下:

String a = "aaa";

String a1 = new String("aaa");

有了上面的解释,这里也就不用多解释了吧?

 

那么equals方法的规则是怎么样的呢?有怎么样的约定?

在JAVA中,equals方法的约定有四个:

一、自反性(reflexiive).对于任何非null的引用值x,x.equals(x)必须反回为true。

二、对称性(symmetric).对于任何非null的引用值x和y,当且仅当y.equals(x)为true时,x.equals(y)也必须返回为true。

三、传递性(transitive).对于任何非null的引用值x、y和z,如果x.equals(y)为true,并且y.equals(z)为true时,则x.equals(z)也必须返回true。

四、一致性(consistent)。对于非null的引用值x和y,只要equals的比较操作在对象中所有的信息没有被 修改,多次调用x.equals(y)就会一致返回true或返回false.

另外需要注意的是:对于任何非空对象x,x.equals(null)必须返回false。

 

如果你一旦重写了equals方法,那么一定要根据四个约定对你的方法进行检测,确保你的equals正确。如果你违反了某条约定,那么当有其它对象调用你的对象时,你将不知道你的对象会产生什么样的行为。

 

这里多讲一下,如果你重写了equals方法,那么,也应该重写hashCode方法。这里不作讨论。

分享到:
评论

相关推荐

    Java中equals方法隐藏的陷阱

    本文将深入探讨Java中`equals`方法的一些常见陷阱,并提供相应的解决方案。 #### 1. `equals`方法签名定义错误 `equals`方法的标准定义是在`java.lang.Object`类中,其签名是`public boolean equals(Object obj)`...

    Java中的==和equals区别

    在Java编程中,比较对象的相等性是一个常见的需求,但很多初学者对于`==`运算符与`equals`方法的区别容易混淆。本文将深入探讨两者之间的差异,以及它们在不同场景下的应用。 #### `==` 运算符 `==`运算符主要用于...

    java中hashcode和equals的详解.pdf

    本文详细介绍了 Java 中的 hashCode 和 equals 方法,探讨了这两个方法的作用、实现机制和使用场景。通过对 hashCode 和 equals 方法的深入分析,我们可以更好地理解 Java 集合的实现原理和哈希表的工作机制。 一、...

    java中equals和的比较.doc

    在Java编程语言中,`equals`方法和`==`操作符都是用来比较对象之间是否相等的重要工具,但它们之间存在显著的区别。理解这些差异对于编写高效且无误的代码至关重要。 #### 二、基本概念 1. **==(双等号)**: - ...

    set接口经常用的hashCode和equals方法详解

    ### set接口中hashCode和equals...在Java中,正确实现`hashCode`和`equals`方法对于确保`Set`接口的有效性和高性能至关重要。开发人员需要仔细设计这两个方法,以满足`Set`接口的要求,并考虑到性能和一致性等方面。

    JAVA中equals和的区别.doc

    在Java编程语言中,`equals`方法和`==`操作符都是用来比较对象之间是否相等的重要工具。然而,它们在实现这一目标的方式上有着本质的区别。理解这些差异对于正确地进行对象比较至关重要。 #### 二、基本概念 1. **...

    Java equals 方法与hashcode 方法的深入解析.rar

    总的来说,理解并正确使用`equals()`和`hashCode()`方法对于编写高质量的Java代码至关重要,尤其是在处理集合框架中的对象时。这两个方法的合理实现能确保对象比较的正确性和哈希表操作的效率。希望这个深入解析能...

    java中equals和==的区别.pdf

    本文将深入探讨这两个操作符在Java中的行为,特别是在处理引用类型,尤其是字符串(String)时的差异。 首先,我们要了解Java中的内存模型。基本数据类型(如int、char)的值直接存储在栈内存中,而引用类型的变量...

    java中equals和==的区别文.pdf

    总之,理解 `equals()` 和 `==` 在Java中的差异对于编写高效、无误的代码至关重要。在比较对象时,使用 `equals()` 来检查内容,而使用 `==` 来检查是否为同一个对象。对于 `String` 类型,还要注意字符串常量池的...

    Java_重写equals()和hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...

    java中equals和==的区别的剖析.pdf

    让我们深入探讨 String 类中的 `equals()` 和 `==` 的区别: 1. 当我们创建两个字符串 `s1 = "Monday"` 和 `s2 = "Monday"` 时,由于字符串字面量的优化,JVM 会在字符串常量池中查找是否存在相同的值。如果找到,...

    java 字符串中文判断

    本文将深入探讨如何在Java中进行中文字符的判断和计数,这主要基于Java的Unicode编码特性以及字符集的理解。 首先,我们需要理解Java中的字符类型`char`。在Java中,一个`char`类型的变量可以存储一个Unicode字符,...

    js equals方法

    在JavaScript中,`equals`方法并不像在其他某些编程语言中那样是内置的,例如Java。但是,由于JavaScript的灵活性,我们可以自定义一个`equals`函数来实现对象间的深度比较。这个方法通常用于比较两个对象的属性和值...

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

    Java 中的每个对象都有 hashCode() 和 equals() 方法,这两个方法的正确实现对于 Java 开发人员来说是非常重要的。本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些...

    java学习equals

    在"java学习equals"这个主题中,我们将深入探讨`equals()`方法的用法、重写以及其与`==`操作符的区别。 首先,`==`操作符在Java中主要用于比较基本类型变量的值,如int、char等,而对于对象,它则比较的是两个引用...

    Java中Equals使用方法汇总

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

    ==和equals的区别

    在 Java 中,比较值大小有两种方法:== 和 equals,这两个方法的使用场景和比较规则不同,下面我们将详细探讨它们的区别。 基本数据类型和引用数据类型 在 Java 中,有两种数据类型:基本数据类型和引用数据类型。...

    298.296.JAVA基础教程_面向对象(中)-总结==与equals()(298).rar

    在Java中,理解和正确使用“==”和“equals()”方法是编程基础的重要部分,尤其对于初学者来说至关重要。本教程将深入探讨这两个概念以及它们在Java中的应用。 首先,“==”运算符在Java中主要用于比较基本类型(如...

    296.294.JAVA基础教程_面向对象(中)-equals()的使用(296).rar

    本教程将深入探讨`equals()`方法的使用及其在Java中的重要性。`equals()`方法是Object类的一个成员,所有Java类都默认继承自Object类,因此几乎每个Java类都有`equals()`方法。 首先,`equals()`方法主要用于比较两...

Global site tag (gtag.js) - Google Analytics