java中"=="和equals的区别
在初学java时,你是否碰到过下面的代码:
String str1=new String("hello");
String str2=new String("hello");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
输出结果为:false true
为什么会这样?"==" 和equals的区别是什么?今天就一起来了解一下java中 " ==" 和equals方法的不同之处:
1."=="比较的内容
==操作符比较的是两个变量的值是否相等,对于引用变量表示的是两个变量在堆中存储的地址是否相等。下面看几个例子:
public class Test {
public static void main(String[] args) {
int n=11;
int m=11;
System.out.println(n==m);
String str=new String("hello");
String str1=new String("hello");
String str2=new String("hello");
System.out.println(str1==str2);
str1=str;
str2=str;
System.out.println(str1==str2);
}
}
输出结果为:true false true
(1)对于第一种情况,变量类型为基本数据类型,直接存储的是变量的“值”,因此在用关系操作符 == 来进行比较时,比较的就是 “值” 本身。
比如:
int n=11;
int m=11;
变量n和变量m都是直接存储的"11"这个数值,所以用==比较的时候结果是true。
(2)对于第二种和第三种情况,变量类型为引用类型的变量,存储的并不是“值”本身,而是与其关联的对象的在内存中地址。但结果为什么会不同?
原来,程序在运行时会创建一个字符串缓冲池,当创建一个字符串时,程序首先会在这个String缓冲池中寻找相同值的对象,在第二段程序中,使用了 new 操作符,它明白地告诉程序:“我要一个新的!”于是新的 String 对象被创建在内存中,他们的值相同,但位置不同,所以用 == 比较时返回false;
而在第三段程序中时,都让 str1 和 str2 指向了 str 指向的对象,那么得到的结果毫无疑问是 true。
2.equals比较的内容
equals 方法是基类 Object中 的方法,因此对于所有的继承于 Object 的类都会有该方法。为了更直观地理解 equals 方法的作用,直接看 Object 类中 equals 方法的实现。
很显然,在 Object 类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。
但为什么下面这段代码的输出结果是 true ?
public class Test {
public static void main(String[] args) {
String str1=new String("hello");
String str2=new String("hello");
System.out.println(str1.equals(str2));
}
}
下面是String类中equals方法的具体实现:
可以看出,String 类对 equals 方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。其他的一些类诸如 Double,Date,Integer 等,都对 equals 方法进行了重写用来比较指向的对象所存储的内容是否相等。
3.总结
(1)对于 == :
如果作用于基本数据类型的变量,则直接比较其存储的“值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址。
(2)对于 equals 方法:
注意:equals 方法不能作用于基本数据类型的变量。
如果没有对 equals 方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如 String、Date 等类对 equals 方法进行了重写的话,比较的是所指向的对象的内容。