检查对象是否相等
关系运算符==和!=也适用于所有对象,但它们的含义通常会使初涉Java领域的人找不到北。下面是一个例子:
//: Equivalence.java
public class Equivalence {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
}
} ///:~
其中,表达式System.out.println(n1 == n2)可打印出内部的布尔比较结果。一般人都会认为输出结果肯定先是true,再是false,因为两个Integer对象都是相同的。但尽管对象的内容相同,句柄(可以理解为两个对象在内存中的地址)却是不同的,而==和!=比较的正好就是对象句柄。所以输出结果实际上先是false,再是true。这自然会使第一次接触的人感到惊奇。
若想对比两个对象的实际内容是否相同,又该如何操作呢?此时,必须使用所有对象都适用的特殊方法equals()。但这个方法不适用于“主类型”,那些类型直接使用==和!=即可。下面举例说明如何使用:
//: EqualsMethod.java
public class EqualsMethod {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1.equals(n2));
}
} ///:~
正如我们预计的那样,此时得到的结果是true。但事情并未到此结束!假设您创建了自己的类,就象下面这样:
//: EqualsMethod2.java
class Value {
int i;
}
public class EqualsMethod2 {
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
}
} ///:~
此时的结果又变回了false!这是由于equals()的默认行为是比较句柄。所以除非在自己的新类中改变了equals(),否则不可能表现出我们希望的行为。但要注意equals()的这种行为方式同时或许能够避免一些“灾难”性的事件。
对于Object类,它提供了一个最最严密的实现,那就是只有是同一对象是,equals方法才返回true,也就是人们常说的引用比较而不是值比较。这个实现严密得已经没有什么实际的意义,所以在具体子类(相对于Object来说)中,如果我们要进行对象的值比较,就必须实现自己的equals方法。
大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄。
分享到:
相关推荐
而equals()方法则是Object类的一个成员方法,用于比较对象的内容是否相等。默认情况下,它只是简单地检查引用是否相同,即与“==”行为一致。但是,对于大多数非原始类型的类(如String、Integer等),equals()通常...
而equals()方法通常用于比较两个对象的内容是否相等,这是通过覆盖Object类中的equals()方法来实现的,使得类的实例在内容上相等时返回true,否则返回false。当我们在自定义类中使用equals()方法时,应遵循一些约定...
Java中的`equals`方法是一个至关重要的方法,用于比较两个对象是否“相等”。在Java API规范中,`equals`方法必须遵循以下五个基本原则: 1. 对于任何引用类型,`o.equals(o)`总是返回`true`。 2. 如果`o.equals(o1...
在 Java 中,equals 方法是一个非常重要的方法,它用于判断两个对象是否相等,而不是判断两个对象的引用是否相同。在 Object 基类中,equals 方法的实现是使用“==”操作符来比较对象的引用,但是这并不满足实际需求...
`equals()`方法最初定义在`Object`类中,用于比较两个对象是否“相等”,这里的“相等”通常是指两个对象的内容或状态是否相同。需要注意的是,`equals()`方法默认的行为仍然是比较对象的引用地址。为了实现真正的...
违反这一规则可能导致哈希表的行为不正确,例如,当两个相等的对象被添加到`HashSet`时,可能会只存储一个,因为哈希码相同但`equals()`未被正确重写,导致误认为是重复项。 以下是一个简单的`equals()`和`hashCode...
当比较两个对象是否相等时,经常需要首先检查传入的参数是否为`null`。如果不做这个检查,而直接调用`equals`方法或访问对象属性,则会导致`NullPointerException`。 **示例代码**: ```java public boolean equals...
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
`equals`方法是Java语言中Object类的一个重要成员方法,其默认实现是比较两个对象的内存地址是否相同(即是否为同一个对象)。为了使对象之间能够基于内容进行比较,通常需要在具体的类中重写`equals`方法。 #### ...
这个方法遍历了给定对象类的所有非静态、非transient属性,获取它们的旧值和新值,然后通过`Objects.equals()`方法比较两者是否相等。如果属性值发生变化,就会将变化记录到结果Map中,其中`DiffResult`是一个自定义...
在Java编程语言中,了解如何正确使用`==`和`equals()`方法是非常关键的,因为它们在比较对象和基本类型时有不同的行为。下面将详细解释这两个方法的工作原理、使用场景以及一些常见误区。 首先,`==`运算符主要用于...
equals 方法是 Object 类的方法,用于比较两个对象的值是否相等。对于基本数据类型,equals 方法不能用于比较,因为基本数据类型没有 equals 方法。 对于引用数据类型,equals 方法比较的是对象的值,而不是内存...
- 该类重写了`equals`方法,用于比较两个`Student`对象是否相同。这是实现列表比较的关键步骤之一。 3. **比较两个列表的不同项**: - 需要遍历第一个列表,对于每个元素,检查它是否存在于第二个列表中。 - ...
在实际编程中,我们通常需要比较两个对象的内容是否相同,这时我们应该使用 equals(Object) 方法,而不是 == 运算符。例如,在比较两个字符串是否相同时,我们应该使用 equals(Object) 方法,而不是 == 运算符。 ...
在 Java 中,我们经常需要比较两个 Integer 对象是否相等,但是在使用 "==" 运算符时,可能会出现一些意外的结果。本文将深入探讨 Java 中的 Integer 比较,了解为什么使用 "==" 运算符可能会出错,并解释如何正确地...
本文实例讲述了C#使用Equals()方法比较两个对象是否相等的方法。分享给大家供大家参考。具体如下: int price = 100; int amount = 1000 if (price.Equals(amount)) { Console.WriteLine(Price is equal to amount...
`equals`方法是`Object`类的一个成员方法,用于比较两个对象的内容是否相等。默认情况下,`equals`方法的行为与`==`类似,即比较的是对象的引用。然而,在许多情况下,特别是对于自定义类或Java标准类库中的类(如`...
2. 对象的`equals()`方法用于比较字符串内容是否相等。 3. 异常处理,尤其是`MalformedURLException`的捕获和处理。 4. 针对协议和端口的比较,以确保全面的匹配。 以上就是关于“Java判断两个网址的主机名是否一样...
只有在对 equals() 方法进行重写的情况下,才能正确地比较两个对象的内容是否相等。 在 String 类中,equals() 方法已经被重写,用于比较两个字符串的内容是否相等。例如: ```java public boolean equals(Object ...
在Java编程语言中,`equals()`方法是用来比较两个对象是否相等的重要工具,与`==`运算符有明显的区别。`==`运算符主要用于检查两个变量是否指向内存中的同一个对象,而`equals()`方法通常用来判断两个对象的内容是否...