一 概念简介
1 ==和equals比较运算符:==要求两个引用变量指向同一对象时才返回true,equals方法则允许用户提供自定义的相等规则。
2 object类提供的equals方法判断两个对象相等的标准与==完全相同。因此开发者通常需要重写equals方法。
二 ==号比较应用
1 代码示例
public class EqualTest { public static void main(String[] args) { int it = 65; float fl = 65.0f; // 将输出true System.out.println("65和65.0f是否相等?" + (it == fl)); char ch = 'A'; // 将输出true System.out.println("65和'A'是否相等?" + (it == ch)); String str1 = new String("hello"); String str2 = new String("hello"); // 将输出false System.out.println("str1和str2是否相等?" + (str1 == str2)); // 将输出true System.out.println("str1是否equals str2?" + (str1.equals(str2))); // 由于java.lang.String与EqualTest类没有继承关系, // 所以下面语句导致编译错误 // System.out.println("hello" == new EqualTest()); } }
2 运行结果
65和65.0f是否相等?true
65和'A'是否相等?true
str1和str2是否相等?false
str1是否equals str2?true
3 结果分析
如果两个变量是基本类型变量,且都是数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,就将返回true。
如果是两个引用类型变量,只有它们指向对一对象时,==判断才会返回true。
三 字符串的==号比较
1 代码示例
public class StringCompareTest { public static void main(String[] args) { // s1直接引用常量池中的"黑客攻击" String s1 = "黑客攻击"; String s2 = "黑客"; String s3 = "攻击"; // s4后面的字符串值可以在编译时就确定下来 // s4直接引用常量池中的"黑客攻击" String s4 = "黑客" + "攻击"; // s5后面的字符串值可以在编译时就确定下来 // s5直接引用常量池中的"黑客攻击" String s5 = "黑" + "客" + "攻击"; // s6后面的字符串值不能在编译时就确定下来, // 不能引用常量池中的字符串 String s6 = s2 + s3; // 使用new调用构造器将会创建一个新的String对象, // s7引用堆内存中新创建的String对象 String s7 = new String("黑客攻击"); System.out.println(s1 == s4); // 输出true System.out.println(s1 == s5); // 输出true System.out.println(s1 == s6); // 输出false System.out.println(s1 == s7); // 输出false } }
2 运行结果
true
true
false
false
3 结果分析
JVM常量池保证相同的字符串直接量只有一个,不会产生多个副本,例子中s1,s4,s5所引用的字符串可以在编译期确定下来,因此它们都引用常量池中的同一字符串对象。
使用new String()创建的字符串是在运行时创建出来的,它保存在运行时内存区,不会放入常量池中。
四 equals方法错误应用
1 代码示例
class Person { // 重写equals()方法,提供自定义的相等标准 public boolean equals(Object obj) { // 不加判断,总是返回true,即Person对象与任何对象都相等 return true; } } // 定义一个Dog空类 class Dog{} public class OverrideEqualsError { public static void main(String[] args) { Person p = new Person(); System.out.println("Person对象是否equals Dog对象?" + p.equals(new Dog())); System.out.println("Person对象是否equals String对象?" + p.equals(new String("Hello"))); } }
2 运行结果
Person对象是否equals Dog对象?true
Person对象是否equals String对象?true
3 结果分析
造成这种荒唐结果的原困是重写Person类的equaIs方法时没有任何判断,无条件返回true。
五 equals方法正确应用
1 代码示例
class Person { private String name; private String idStr; public Person(){} public Person(String name , String idStr) { this.name = name; this.idStr = idStr; } // 此处省略name和idStr的setter和getter方法。 // name的setter和getter方法 public void setName(String name) { this.name = name; } public String getName() { return this.name; } // idStr的setter和getter方法 public void setIdStr(String idStr) { this.idStr = idStr; } public String getIdStr() { return this.idStr; } // 重写equals()方法,提供自定义的相等标准 public boolean equals(Object obj) { // 如果两个对象为同一个对象 if (this == obj) return true; // 只有当obj是Person对象 if (obj != null && obj.getClass() == Person.class) { Person personObj = (Person)obj; // 并且当前对象的idStr与obj对象的idStr相等才可判断两个对象相等 if (this.getIdStr().equals(personObj.getIdStr())) { return true; } } return false; } } public class OverrideEqualsRight { public static void main(String[] args) { Person p1 = new Person("孙猴子" , "12343433433"); Person p2 = new Person("孙行者" , "12343433433"); Person p3 = new Person("局八戒" , "99933433"); // p1和p2的idStr相等,所以输出true System.out.println("p1和p2是否相等?" + p1.equals(p2)); // p2和p3的idStr不相等,所以输出false System.out.println("p2和p3是否相等?" + p2.equals(p3)); } }
2 运行结果
p1和p2是否相等?true
p2和p3是否相等?false
3 结果分析
通常而言,正确重写equals方法应满足:自反性,对称性,传递性,一致性,对于任何不是null的x,x.equals(null)一定返回faIse。
相关推荐
### Java中的`==`与`equals`方法的区别详解 在Java编程中,比较对象的相等性是一个常见的需求,但很多初学者对于`==`运算符与`equals`方法的区别容易混淆。本文将深入探讨两者之间的差异,以及它们在不同场景下的...
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...
Java 中的 == 和 equals 方法的区别 在 Java 中,比较值大小有两种方法:== 和 equals,这两个方法的使用场景和比较规则不同,下面我们将详细探讨它们的区别。 基本数据类型和引用数据类型 在 Java 中,有两种...
对于开发的程序员小伙伴,大家肯定对于==和equals不陌生,而且会经常用到他,那么又有几个能够说清楚了==和equals是怎么回事呢?他了呢两个有什么区别呢? 比较 == 比较的是栈中的值,基本数据类型是变量值,引用...
"java基础之“==”与“equals”区别详解" 根据java基础之“==”与“equals”区别详解,以下是相关知识...学习java基础之“==”与equals()需要充分理解它们的区别和应用场景,并且需要通过实践和练习来熟悉它们的使用。
在Java编程语言中,了解如何正确使用`==`和`equals()`方法是非常关键的,因为它们在比较对象和基本类型时有不同的行为。下面将详细解释这两个方法的工作原理、使用场景以及一些常见误区。 首先,`==`运算符主要用于...
"Java中的==和equals方法比较" 在Java中,`==`和`equals`是两种不同的比较方法,前者比较引用地址,而后者比较对象的实际内容。 首先,让我们来看看`==`运算符的用法。`==`运算符可以用来比较基本数据类型和引用...
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。 首先,我们需要了解 Java 中的内存模型。在 Java 中,变量可以分为两种:基本类型(primitive type)和...
在Java编程语言中,`==`和`equals()`方法是用来比较对象之间关系的两种常见方式,但它们在使用上有着显著的区别。 首先,`==`运算符主要用于比较基本类型(如int、char、byte等)的值是否相等,或者比较引用类型...
在Java编程语言中,`equals()` 和 `==` 运算符经常被用来比较对象,但它们之间存在着显著的区别。理解这些差异对于编写正确、健壮的代码至关重要。以下是关于 `equals()` 和 `==` 在Java中的详细解释。 首先,`==` ...
简单介绍java中的“==”和equals
在Java编程语言中,了解`==`和`equals()`的区别是非常重要的,这涉及到对基本类型和对象的正确比较。下面我们将详细探讨这两个操作符的工作原理及其在不同情况下的使用。 首先,`==`操作符主要用于比较基本类型的...
==运算符、equals方法和intern方法都是Java中的重要概念,它们之间的区别和联系是Java程序设计语言中的一個非常重要的知识点。 知识点: 1. ==运算符:比较两个对象是否是同一个对象。 2. equals方法:比较两个...
【Java面试题】equals与==的区别
Java 中关于 == 和 equal 的区别 及其 equals() 方法重写 Java 语言是 Sun 公司的开发成果,其主要特点是可以执行强,与平台的无关性使其实用性更强。但是 Java 中的 == 与 equal 是有区别的。 == 操作符是 Java ...
Java 中的 == 和 equals() 是两个不同的比较方法,它们之间有着很大的区别。== 操作符专门用来比较两个变量的值是否相等,也就是比较变量所对应的内存中所存储的数值是否相同。用于比较两个基本类型的数据或两个引用...
"=="和"equals()"是两种常用的字符串比较方法,但它们之间存在一定的区别和使用场景。这篇博客将深入探讨这两个方法的工作原理以及何时应该使用它们。 首先,"=="运算符在Java中主要用于比较基本类型变量的值,如...
在Java编程语言中,`==` 运算符与 `equals()` 方法被广泛用于比较对象,尤其是当处理字符串(`String` 类)时。这两者之间的区别是理解Java内存管理和对象引用的关键。以下是对给定代码片段中所展示概念的详细解析。...
Java中==符号与equals()的使用详解是Java程序中的一个重要概念,它们都是用来测试两个变量是否相等的,但是它们的使用方法和应用场景是不同的。下面我们将详细介绍Java中==符号与equals()的使用详解。 一、使用==...