在Java中“==”和equals()都有比较的意思,只是比较的内容不同,以前自己错认为“==”比较的是句柄(引用),equals()比较的是内容,但是通过下面这个程序可以发现问题:
class Value {
int i;
}
public class EqualsMethod {
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i = 100;
v2.i = 100;
System.out.println(v1 == v2);
System.out.println(v1.equals(v2));
}
}
输出结果:
false
false
结果并不是想象的false和true,这是为什么呢?通过查资料之后找到了原因:对于String 、Integer、Double等这些封装类来说,这些类重写了Object中的equals()方法,让它不再比较句柄(引用),而是比较对象中实际包含的值,即比较的是内容。而Object的equals()方法比较的是地址值,上面程序自定义的类Value继承了Object的equals()方法,如果不重写,那么比较的就是句柄(引用)。
public boolean equals(Object obj) {
return (this == obj);
}
上面一段程序是Object的equals()方法定义,由此可以看出,在object类中“==”和equals()方法的作用是相同的,他们比较的都是句柄(引用)。
如果想比较上面程序中v1和v2的内容,可以重写equals()方法和hashCode()方法,修改后的程序如下:
class Value {
int i;
public int hashCode()
{
return i*hashCode();
}
public boolean equals(Object o)
{
Value v=(Value)o;
return i==v.i;
}
}
public class EqualsMethod {
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i = 100;
v2.i = 100;
System.out.println(v1 == v2);
System.out.println(v1.equals(v2));
}
}
输出结果:
false
true
经过重写后,equals()方法比较的是对象中包含的值,因为对象v1和v2都只有一个相同的属性i,且都等于100,因此v1.equals(v2)输出true。
在这里说明一下,为什么在重写equals()方法的时候还要重写hashCode()方法。在java的集合中,判断两个对象是否相等的规则步骤是:
1、判断两个对象的hashCode是否相等
2、如果不相等,认为两个对象也不相等
3、如果相等,则判断两个对象用equals运算是否相等
4、如果不相等,认为两个对象也不相等
5、如果相等,认为两个对象相等
在理论上hashCode()方法不重写,运行结果也是false和true,但是这样就会降低存储效率,通常情况下,会将重写hashCode()方法看成是必须的。
另外,还有一点需要记住,equals()相等的两个对象,hashCode()一定相等,
equals()不相等的两个对象,却并不能证明他们的hashCode()不相等。
分享到:
相关推荐
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...
对于开发的程序员小伙伴,大家肯定对于==和equals不陌生,而且会经常用到他,那么又有几个能够说清楚了==和equals是怎么回事呢?他了呢两个有什么区别呢? 比较 == 比较的是栈中的值,基本数据类型是变量值,引用...
### Java中的`==`与`equals`方法的区别详解 在Java编程中,比较对象的相等性是一个常见的需求,但很多初学者对于`==`运算符与`equals`方法的区别容易混淆。本文将深入探讨两者之间的差异,以及它们在不同场景下的...
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。 首先,我们需要了解 Java 中的内存模型。在 Java 中,变量可以分为两种:基本类型(primitive type)和...
在Java编程语言中,`equals()` 和 `==` 运算符经常被用来比较对象,但它们之间存在着显著的区别。理解这些差异对于编写正确、健壮的代码至关重要。以下是关于 `equals()` 和 `==` 在Java中的详细解释。 首先,`==` ...
Java 中的 == 和 equals 方法的区别 在 Java 中,比较值大小有两种方法:== 和 equals,这两个方法的使用场景和比较规则不同,下面我们将详细探讨它们的区别。 基本数据类型和引用数据类型 在 Java 中,有两种...
在Java编程语言中,了解`==`和`equals()`的区别是非常重要的,这涉及到对基本类型和对象的正确比较。下面我们将详细探讨这两个操作符的工作原理及其在不同情况下的使用。 首先,`==`操作符主要用于比较基本类型的...
在Java编程语言中,了解如何正确使用`==`和`equals()`方法是非常关键的,因为它们在比较对象和基本类型时有不同的行为。下面将详细解释这两个方法的工作原理、使用场景以及一些常见误区。 首先,`==`运算符主要用于...
【Java面试题】equals与==的区别
"Java中的==和equals方法比较" 在Java中,`==`和`equals`是两种不同的比较方法,前者比较引用地址,而后者比较对象的实际内容。 首先,让我们来看看`==`运算符的用法。`==`运算符可以用来比较基本数据类型和引用...
在java基础开发中,“==”操作符和equals()方法是非常重要的比较操作符。正确地使用“==”操作符和equals()方法可以避免许多错误,提高程序的稳定性和可靠性。 9. java基础之“==”与equals()的应用场景: java基础...
Java 中的 == 和 equals 方法的用法 Java 中的 == 和 equals 方法是两个常用的比较操作符,然而,它们的用法和作用却大不相同。本文将详细介绍 Java 中 == 和 equals 方法的用法、区别和应用场景。 一、== 操作符...
在Java编程语言中,`equals()`方法和`==`运算符是两个经常被用来比较对象是否相等的关键概念。理解它们的区别和用法对于任何Java开发者来说都至关重要,特别是对于那些正在积累Java开发经验的人来说。 首先,让我们...
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个常用的操作符,经常用于比较对象或变量的值。然而,许多开发者不知道它们之间的区别,或者误用它们,导致程序出错。下面我们将详细解释 equals 和 == 的...
在Java编程语言中,`==`和`equals()`方法是用来比较对象之间关系的两种常见方式,但它们在使用上有着显著的区别。 首先,`==`运算符主要用于比较基本类型(如int、char、byte等)的值是否相等,或者比较引用类型...
Java中equals与==的用法和区别 Java 中的 equals 与 == 是两个常用的比较操作符,但是它们的用法和区别却非常重要。理解它们的差异是编写高效、正确的 Java 程序的关键。 什么是 == ? 在 Java 中,== 是一个比较...
本篇复习将重点讨论String类中的`equals()`方法和`==`运算符的区别,这对于理解对象比较和字符串操作至关重要。 首先,`==`运算符在Java中用于比较基本类型(如int、char)的值,而在比较对象时,它实际上是检查两...
在Java编程语言中,`equals()`方法和`==`运算符是两个经常被用来比较对象是否相等的关键概念。理解它们的区别对于编写出正确、健壮的代码至关重要。 首先,`==`运算符用于基本类型(如int, char, boolean)的比较,...
Java 中的equals和==的区别 Java 是一种面向对象的编程语言,其中有两种数据类型:基本数据类型和引用数据类型。基本数据类型包括整数类型、浮点数类型、字符类型、布尔类型等,共有八种;而引用数据类型则包括 ...