这两天一直在看数据结构和算法,看到一些内容就想起了龙哥曾经讲过的“equals”和“==”的区别,于是重新回顾梳理了一遍,更加深了印象。现在做一下比较:
要辨别“equals”和“==”,首先必须明白两个概念“值传递”和“引用传递”。
简单来说,“值传递”就是当你创建一个对象的时候(注意啊:int一个整型也是创建对象),JVM在内存中给你的这个对象开辟了一块地址;“引用传递”就是不重新分配内存资源,只是把你新声明(注意是声明啊,并没有实例化一个对象)的对象指向了一个已经在内存中有的对象,即两个对象名同指一处地址,当然我更改这个对象的值后,两个对象名所指向的这个对象的值都变了。
(ps:这个地方被大神指出有误,部分地方博主进行了更改,划掉的区域是被指出有误的地方,为避免难以看懂评论,特作此处理。博主另写了一篇博文对内存分配中的"栈"与"堆"进行了分析)
这里还要强调一下“new”,这是实例化对象的标识,也就是在内存中重新分配空间的标识。(关键字new为每个对象申请内存空间,除基本类型,且所有的对象都在堆heap中分配空间)我们通常用的时候,例如比较字符串,“equals”比较的是这两个字符串的值是不是一样,而“==”则比较的是这两个字符串的引用地址是否一样。例如下面的代码示例:
/** * 字符串中“equals”和“==”对比示例 * @author 赵广超 */ public class equalsTest { public static void main(String[] args) { String aaa =new String("abc"); String bbb =new String("abc"); String ccc ="abc"; String ddd=aaa; if(aaa == bbb){ System.out.println("aaa == bbb"); }else{ System.out.println("aaa != bbb"); } if(aaa.equals(bbb)){ System.out.println("aaa equals bbb "); }else{ System.out.println("aaa not equals bbb "); } if(aaa == ccc){ System.out.println("aaa == ccc"); }else{ System.out.println("aaa != ccc"); } if(aaa.equals(ccc)){ System.out.println("aaa equals ccc "); }else{ System.out.println("aaa not equals ccc "); } if(bbb == ccc){ System.out.println("bbb == ccc"); }else{ System.out.println("bbb != ccc"); } if(bbb.equals(ccc)){ System.out.println("bbb equals ccc "); }else{ System.out.println("bbb not equals ccc "); } if(aaa == ddd){ System.out.println("aaa == ddd"); }else{ System.out.println("aaa != ddd"); } if(aaa.equals(ddd)){ System.out.println("aaa equals ddd "); }else{ System.out.println("aaa not equals ddd "); } if(bbb == ddd){ System.out.println("bbb == ddd"); }else{ System.out.println("bbb != ddd"); } if(bbb.equals(ddd)){ System.out.println("bbb equals ddd "); }else{ System.out.println("bbb not equals ddd "); } if(ccc == ddd){ System.out.println("ccc == ddd"); }else{ System.out.println("ccc != ddd"); } if(ccc.equals(ddd)){ System.out.println("ccc equals ddd "); }else{ System.out.println("ccc not equals ddd "); } } }
结果如下:
aaa != bbb
aaa equals bbb
aaa != ccc
aaa equals ccc
bbb != ccc
bbb equals ccc
aaa == ddd
aaa equals ddd
bbb != ddd
bbb equals ddd
ccc != ddd
ccc equals ddd
对上面的结果我们可以做如下解释:
String aaa =new String("abc");
String bbb =new String("abc");
String ccc ="abc";
String ddd=aaa;
左边的代码在内存中分配的结果如右边所示:故有控制台的打印信息 即“equals“比较的是两个值是不是一样,而”==“比较的是内存地址是不是相同。
可是,实际的并不总是这样的。String类中的Equals这个方法重写了超类Object(Object类被所有的其他类继承)中的equals方法。而Object超类中有如下代码:
public boolean equals(Object obj) { return (this == obj); }
就是说,超类中的equals和==是一码子事,比较的都是内存地址。
在String类中,重写的equals方法代码如下:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
可见,在不同的类中,引用equals方法时,可能会有不一样的效果。这就提醒我们在编写自己的类时,如果要比较的话,要注意重写Object类中的equals方法。
——2013.1.3写于新校区图书馆
强烈建议转至痴情研究java内存中的对象一文进行深入探究
相关推荐
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。 首先,我们需要了解 Java 中的内存模型。在 Java 中,变量可以分为两种:基本类型(primitive type)和...
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个常用的操作符,经常用于比较对象或变量的值。然而,许多开发者不知道它们之间的区别,或者误用它们,导致程序出错。下面我们将详细解释 equals 和 == 的...
本篇复习将重点讨论String类中的`equals()`方法和`==`运算符的区别,这对于理解对象比较和字符串操作至关重要。 首先,`==`运算符在Java中用于比较基本类型(如int、char)的值,而在比较对象时,它实际上是检查两...
Java 中equals和==的区别
【Java面试题】equals与==的区别
在Java编程语言中,`equals`方法与`==`操作符是进行对象比较时最常用的两种方式,但它们之间存在着显著的区别。理解这些差异对于正确地处理对象比较至关重要。 ### `==` 操作符 `==`操作符主要用于比较两个基本...
java中equals和==的区别-5页.pdf
Java 中的equals和==的区别 Java 是一种面向对象的编程语言,其中有两种数据类型:基本数据类型和引用数据类型。基本数据类型包括整数类型、浮点数类型、字符类型、布尔类型等,共有八种;而引用数据类型则包括 ...
理解`equals()`和`==`的区别对于避免常见的错误至关重要,比如在比较自定义对象时误用`==`而导致预期结果出错。当比较自定义对象时,通常应该重写`equals()`方法,以便比较对象的属性或状态,而不是仅仅比较引用。...
在Java编程语言中,`equals()`方法和`==`运算符是两个经常被用来比较对象是否相等的关键概念。理解它们的区别对于编写出正确、健壮的代码至关重要。 首先,`==`运算符用于基本类型(如int, char, boolean)的比较,...
Java中equals和==的区别 Java是一门面向对象的编程语言,它提供了多种运算符和方法来比较对象和变量。在Java中,比较两个对象是否相等时,经常使用到的运算符有"=="和"equals"。虽然两者都可以用于比较,但它们有着...
在Java编程语言中,`equals()` 和 `==` 运算符在比较对象时有着显著的不同。理解这两者的区别对于编写高效、可靠的代码至关重要。以下是它们的详细解释: 1. **`==` 运算符**: `==` 在Java中主要用于比较基本类型...