浅谈equals与==的区别

以前学习java时,觉得equals与==没什么区别,当然也不知道他们有什么区别?那次听完课之后,自己查了些资料,稍微对它们两有点了解,下面是我对equals与==区别的一些看法:

1.==有两种用法:第一,用在八种基本类型中时,是判断两个变量的值是否相等,相同时则返回true,不同时则返回false.第二,当用在引用类型中时,它并非是判断两个对象的内容是否相等,而是判断两个对象所指向的内存地址是否相同,相同时则返回true,不同时则返回false.

2.equals只能用在引用类型中,不能用在基本类型中,因为equals是方法,基本类型没有equals方法,equals比较的是对象所指向的内容是否相同,相同,则返回true,不同则返回false

3.equals是方法,而==是运算符,当一个类没有重写equals方法时,默认的是object中的equals方法,而Object中的equals方法其实就是用==来判断的。

先来看下代码吧:

public class A{
publci static void main(String [] args){
int a=15;
int b=15;
System.out.println("a与b是否相等"+(a==b);}
}

 这是个比较简单的代码,但是如果我用equals比较时,会报错,因为equals方法不能用于基本数据类型,如果硬要用equals方法,只能将整型封装

		Integer a1=1;
		Integer b1=1;
		Integer a2=new Integer(1);
		Integer b2=new Integer(1);
		System.out.println("a1与b1用==比较时,是否相等?"+(a1==b1));
		System.out.println("a1与b1用equals比较时,是否相等?"+a1.equals(b1));
		System.out.println("a2与b2用==比较时,是否相等?"+(a2==b2));
		System.out.println("a2与b2用equals比较时,是否相等?"+a2.equals(b2));
		System.out.println("a1与a2用==比较时,是否相等?"+(a1==a2));
		System.out.println("a1与a2用equals比较时,是否相等?"+a1.equals(a2));
		

 

这样就不会报错了,运行的结果是:

a1与b1用==比较时,是否相等?true
a1与b1用equals比较时,是否相等?true
a2与b2用==比较时,是否相等?false
a2与b2用equals比较时,是否相等?true
a1与a2用==比较时,是否相等?false
a1与a2用equals比较时,是否相等?true
运行的结果跟String类型相同,等下我就只分析String中的运行结果:

4.讲一下String类中equals与==得区别

先看下代码吧:

		String s1="abc";
		String s2="abc";
		String s3=new String("abc");
		String s4=new String("abc");
		String s5="de";
		String s6="abcde";
		String s7=s1+s5;

  不管我们用equals方法还是==去比较s1和s2时,输出的都是true,但我们需要注意的是:如果我们写成这样,System.out.println("s1与s2是否相等?"+s1==s2),这样输出的答案就为false了,因为+运算符的优先级别要高于==,所以,s1先与前面的字符串中相加,然后在与s2做比较,得出的答案肯定为false了,我们以后再写程序时一定要注意。

当s1与s2做比较时,具体步骤是这样的,先将s1中的abc放入字符串池中,然后,s2先往字符串池中寻找是否有与之相同的字符串,找到了abc,则就不需要把它的字符串放入字符串池中,字符串池中的字符可以达到资源共享,节省了空间。

当s3与s4用==比较时,返回的值为false,因为这是两个不同的对象,他们创建时,内存地址肯定不同,而==比较的正是两对象的内存地址是否相同,故返回值为false,当用equals比较时,是判断两个的值是否相等,由程序可知,他们两的内容相等,故返回为true.

在比较s6与s7:s6是字符串常量,放在字符串池中,但是s7并不是放在字符串池中,所以s6与s7用==比较时,返回的是false,用equals比较返回的是true,但是如果我在声明一个变量,String s8="abc"+"de";这时,s6与s8用==比较时,返回的是true,用equals方法返回的肯定也是true。这是因为s8此时也是放在字符串池中,他们俩的地址是一样的。

如果==和equals用在引用类型中,那么,用==判断时,返回的是ture,那么,很显然用equals判断返回的也是true,但是反过来就不一定成立了,因为内容相同,并不代表他们的地址也相同,很明显,上面的s3与s4证明了此观点。但是当加上这样一条语句,就不同了,s3=s4,此时,不管是用哪种方法判断,返回的值都为ture,因为是将s4赋值给s3,所以他们两就指向同一个对象了。

5,当然每个类中都有自己的equals方法,当比较队列,和map中的属性时,不能用==比较,只能用equals方法比较,像这种比较,跟我们前面讲String类差不多,只要看一下他们各自写的equals方法就可以了。

6.总之,记住一句话:==比较的是基本数据类型的值是否相等和引用类型中对象的内存地址是否相等,而equals方法判断的是对象的内容是否相等

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值