Java中equals()和==的区别


本文主要针对在进行判断两个数据是否相等时,用到的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有其自身的实现,而不再是比较类在堆内存中的存放地址了,比较的是所指向的对象的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值