在工作中经常遇到这样的问题,很容易搞混淆:
有两种用法说明: (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。 “==”比较两个变量本身的值,即两个对象在内存中的首地址。 “equals()”比较字符串中所包含的内容是否相同。 比如: String s1,s2,s3 = "abc", s4 ="abc" ; s1 = new String("abc"); s2 = new String("abc"); 那么: s1==s2 是 false //两个变量的内存地址不一样,也就是说它们指向的对象不 一样, 故不相等。 s1.equals(s2) 是 true //两个变量的所包含的内容是abc,故相等。 注意(1): 如果: StringBuffer s1 = new StringBuffer("a"); StringBuffer s2 = new StringBuffer("a"); 结果: s1.equals(s2) //是false 解释:StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类, 而Object类中的equals方法是用来比较“地址”的,所以等于false. 注意(2): 对于s3和s4来说,有一点不一样要引起注意,由于s3和s4是两个字符 串常量所生成的变量,其中所存放的内存地址是相等的, 所以s3==s4是true(即使没有s3=s4这样一个赋值语句) (2)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其 对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。 比如: class A { A obj1 = new A(); A obj2 = new A(); } 那么:obj1==obj2是false obj1.equals(obj2)是false 但是如加上这样一句:obj1=obj2; 那么 obj1==obj2 是true obj1.equals(obj2) 是true 总之:equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较 其指向的对象是否相同的。 == 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。 String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以是true。 关于equals与==的区别从以下几个方面来说: (1)如果是基本类型比较,那么只能用==来比较,不能用equals 比如: public class TestEquals { public static void main(String[] args) { int a = 3; int b = 4; int c = 3; System.out.println(a == b);//结果是false System.out.println(a == c);//结果是true System.out.println(a.equals(c));//错误,编译不能通过,equals方法 //不能运用与基本类型的比较 } } (2)对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、 Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。比如: public class TestEquals { public static void main(String[] args) { Integer n1 = new Integer(30); Integer n2 = new Integer(30); Integer n3 = new Integer(31); System.out.println(n1 == n2);//结果是false 两个不同的Integer对象,故其地址不同, System.out.println(n1 == n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象 中的内容是相等的,都是30,故equals比较后结果是true System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31 } } 这是Integer的实例,如果是其他的比如Double、Character、Float等也一样。 (3)注意:对于String(字符串)、StringBuffer(线程安全的可变字符序列)、StringBuilder (可变字符序列)这三个类作进一步的说明。 (a)首先,介绍String的用法,请看下面的实例: public class TestEquals { public static void main(String[] args) { String s1 = "123"; String s2 = "123"; String s3 = "abc"; String s4 = new String("123"); String s5 = new String("123"); String s6 = new String("abc"); System.out.println(s1 == s2);//(1)true System.out.println(s1.equals(s2));//(2)true System.out.println(s1 == s3);//(3)flase System.out.println(s1.equals(s3));//(4)flase System.out.println(s4 == s5);//(5)flase System.out.println(s4.equals(s5));//(6)true System.out.println(s4 == s6);//(7)flase System.out.println(s4.equals(s6));//(8)flase System.out.println(s1 == s4);//(9)false System.out.println(s1.equals(s4));//(10)true } } 答案解释:s1与s2分别指向由字符串常量”123” 创建的对象,在常量池中,只有一个对象, 内容为123,有两个引用s1和s2指向这个对象,故这两个引用变量所指向的地址是相同的, 因而(1)处的运行结果为true,又因为s1.equals(s2)是比较s1和s2所指向的对象的内容是 否相等,而我们知道这两个对象的内容都是字符串常量”123”,故标记(2)处的运行 结果是true。 用同样的方法分析,s1和s3所指向的对象不一样,内容也不一样,故标记(3)和(4)处 运行结果是false。 再看看s4和s5,这两个引用变量所指向的对象的内容都是一样的(内容都是123),但是这两个 对象是用new操作符创建处类的,是在内存中分配两块空间给这两个对象的,因而这两个对象的 内存地址不一样,故事两个不同的对象,标记(5)处的s4 == s5 运行结果为false,但是内容 一样,故标记(6)处的s4.equals(s5)运行结果为true。同理,s4和s6所指向的对象地址不同 ,内容也不相同。故标记(7)(8)处运行结果为false。 s1和s4分别指向两个不同的对象(之所以这样称呼,是因为这两个对象在内存中的地址不相同 ,故而对象不相同),故标记为(9)处的s1 == s4运行结果为false,而标记为(10)处 的s1.equals(s4)运行结果疑问:乍一看结果,有点惊讶,为什么不是true呢,不是说 equals方法是比较内容的吗? 解释:不错,如果在新类中被覆盖了equals方法,就可以用来比较内容的。但是在上面的例子 中类Value并没有覆盖Object中的equals方法,而是继承了该方法,因此它就是被用来比较地 址的,又v1和v2的所指向的对象不相同,故标记(1)处的v1.equals(v2)运行结果为false, 标记为(2)处的v1 == v2运行结果也为false。
相关推荐
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...
### Java中的`==`与`equals`方法的区别详解 在Java编程中,比较对象的相等性是一个常见的需求,但很多初学者对于`==`运算符与`equals`方法的区别容易混淆。本文将深入探讨两者之间的差异,以及它们在不同场景下的...
计算机后端-Java-Java核心基础-第14章 面向对象06 15. 总结==与equals().avi
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。 首先,我们需要了解 Java 中的内存模型。在 Java 中,变量可以分为两种:基本类型(primitive type)和...
【Java面试题】equals与==的区别
本篇复习将重点讨论String类中的`equals()`方法和`==`运算符的区别,这对于理解对象比较和字符串操作至关重要。 首先,`==`运算符在Java中用于比较基本类型(如int、char)的值,而在比较对象时,它实际上是检查两...
Java 中的 == 和 equals 方法的区别 在 Java 中,比较值大小有两种方法:== 和 equals,这两个方法的使用场景和比较规则不同,下面我们将详细探讨它们的区别。 基本数据类型和引用数据类型 在 Java 中,有两种...
Java 中的equals和==的区别 Java 是一种面向对象的编程语言,其中有两种数据类型:基本数据类型和引用数据类型。基本数据类型包括整数类型、浮点数类型、字符类型、布尔类型等,共有八种;而引用数据类型则包括 ...
"Java中的==和equals方法比较" 在Java中,`==`和`equals`是两种不同的比较方法,前者比较引用地址,而后者比较对象的实际内容。 首先,让我们来看看`==`运算符的用法。`==`运算符可以用来比较基本数据类型和引用...
计算机后端-Java-Java核心基础-第14章 面向对象06 14. 重写equals().avi
equals() 是 Java 中的一个方法,用于比较对象是否相等。它是 Object 类的方法,在许多类中都可以使用。 在默认情况下,equals() 方法用于比较两个对象的引用是否相等,即判断它们是否指向同一个内存地址。这是通过...
java中equals和==的区别-5页.pdf
在Java编程语言中,`equals`方法与`==`操作符是进行对象比较时最常用的两种方式,但它们之间存在着显著的区别。理解这些差异对于正确地处理对象比较至关重要。 ### `==` 操作符 `==`操作符主要用于比较两个基本...
"java基础之“==”与“equals”区别详解" 根据java基础之“==”与“equals”区别详解,以下是相关知识点: 1. “==”操作符的作用: 在java中,“==”操作符用于比较两个对象是否相等。对于基本类型来说,“==”...
计算机后端-Java-Java核心基础-第14章 面向对象06 13. equals()的使用.avi
根据给定文件的信息,我们可以提炼出一系列与Java基础及面试相关的知识点,并进行详细的解析: ### 1. Spring、Hibernate、Struts的关系 Spring、Hibernate 和 Struts 是三个非常流行的 Java 框架,它们在 J2EE ...
在Java中,理解和正确使用“==”和“equals()”方法是编程基础的重要部分,尤其对于初学者来说至关重要。本教程将深入探讨这两个概念以及它们在Java中的应用。 首先,“==”运算符在Java中主要用于比较基本类型(如...
计算机后端-Java-Java核心基础-第14章 面向对象06 16. equals()练习1:代码实现.avi