您的位置:首页 > 编程语言 > Java开发

Java中equals()和==的区别

2016-06-06 00:46 441 查看
本文主要针对在进行判断两个数据是否相等时,用到的equals()和“==”进行说明,以便于在实际使用时,选择正确的方式进行比较。

首先,看一个简单的例子,代码如下:

public static void main(String args[]){
int a = 3;
int b = 3;
String str1 = new String("hello world");
String str2 = new String("hello world");

System.out.println(a==b);  //1
System.out.println(str1==str2); //2
System.out.println(str1.equals(str2));	//3

}


这段代码执行后的输出结果是什么呢?

其中,示例中的1处,不用说,输出结果肯定是true,那么2和3呢?正确的输出结果分别是false和true。针对这两种不同的比较方式,返回的结果不一样,主要是因为Java中原始数据类型和引用类型的不同而引起的。

示例中,变量a和b均是原始数据类型,因此变量a和b中存放的就是“3”这个数值,因此用“==”比较时,输出结果为true;同时需要注意,原始数据类型,不能调用equals()方法。

而变量str1和str2,是对象引用,它们存放的是并不是String对象中的值,存储的是该对象的在内存中的物理地址,因此当声明str1和str2时,分别指向了不同的对象,即存储了不同的物理地址,因此在实例中的2处,输出结果为false。3处调用了String对象的equals方法,该方法重载了Object类的equals方法,比较的是对象中的内容。因此输出结果为true。

将程序稍微改一下,如下:

public static void main(String args[]){
int a = 3;
int b = 3;
String str1 ="hello world";
String str2 ="hello world";

System.out.println(a==b);  //1
System.out.println(str1==str2);  //2
System.out.println(str1.equals(str2));		//3

}


那么,程序运行后,输出的结果,全部为true。1处和3处不用说,通过前面的介绍,这是肯定的,但2处确不一样了。这是因为程序在运行的时候会创建一个字符串缓冲池当使用 str1 ="hello world"这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在这个实例程序中,str1先被放到了池中,所以在str2被创建的时候,程序找到了具有相同值的str1,因此就将str2直接使用str1所引用的对象"hello world"的物理地址,也就是说str1和str2拥有相同的物理地址。

通过上面两个例子,对equals()和“==”做一个总结:

1) 对于“==”,如果是用于比较连个原始数据类型,则比较的是其存储的“值”是否相等,而用于比较两个引用类型的变量时,则比较的是所指向的对象的物理地址。

2)对于equals(),在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。但如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了,比较的是所指向的对象的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: