Java中==与equals的区别

Ava ·
更新时间:2024-11-15
· 700 次阅读

用此blog记录我学习的过程,文中若有不恰当的地方,还望友情指出互相学习。

一、== 主要有两种比较形式 基本数据类型(也称原始数据类型):byte,short,double,char,int,long,float,boolean.他们之间的比较应该用==,比较的是他们的值是否相等。 引用数据类型:当他们在用==比较的时候,比较的是他们在内存中的存放地址。(除非是同一个new出来的对象,他们比较的结果是true,否则都是false,因为每一次new都会重新开辟一块内存空间出来。) 二、equals()方法

Java中所有的类都继承自Object类,equals()方法就在Object类中被定义,源码为:

public boolean equals(Object obj) { return (this == obj); }

可以看到,这个方法初始默认是比较的两个对象的地址值,但是在一些类中被重写了,如Sting类重写了equals()方法,一般都是用来比较两个成员变量的值是否相同,而不是再比较两个对象在内存中的存放地址。

做个小结

==的作用: 基本数据类型:比较的是值是否相等 引用数据类型:比较的是地址是否相等 equals()的作用 默认情况下比较的是地址的值 若重写了equals方法(一般都是自动生成)比较的是对象的值是否相等 三、关于String类的equals()方法

下面举例说明:

public class Test { public static void main(String[] args) { Student a = new Student(); Student b = new Student(); //每new一次都会开辟一块新的内存空间 System.out.println(a==b); //false a与的b地址不同 System.out.println(a.equals(b)); //false a与b的地址不同 String aa = "ab"; //放在常量池中 String bb = "ab"; //从常量池中查找 //***这里值得注意 System.out.println(aa==bb); //true aa与bb指向同一个对象 System.out.println(aa.equals(bb)); //true 两对象的值都是“ab” } }

关于倒数第二个为什么是true呢,要先来讲讲String pool(字符串常量池)了,下面先引用一张图片进行说明:


我们看到在创建str1时,在堆内存中的String pool中开辟了一块内存空间装入“Hello World” ,值得注意的是,在这个String pool常量池中,仅创建和存储一个值为“ Hello World”的String对象。任何其他获得值“ Hello World”的字符串将引用池中的同一String对象。所以上面的例子中aa==bb为true。

现在在看这样一个例子:

public static void main(String[]args){ String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); System.out.println(str1 == str2);//true System.out.println(str1 == str3);//false }

第一个为true我们可以理解,那为什么str1==str3是false呢,这意味着str3没有指向String pool中与str1相同的String对象,上面我们说过,在String pool中仅仅会创建和存储一个值相同的String对象,而当用new关键字创建String对象时,会在堆中创建一个全新的String对象,此String实例并不存储在String pool中,而是存储在普通的堆中。

注:以后在判断两个字符串是否相等的时候就使用equals()方法就行了

参考:

https://examples.javacodegeeks.com/core-java/lang/string/java-string-pool-example/

https://www.cnblogs.com/qianguyihao/p/3929585.html


作者:世银



equals JAVA

需要 登录 后方可回复, 如果你还没有账号请 注册新账号