浅析Java中的equals和==

浅析Java中的equals和==


前言


在我们初学java时候,我们总会出现下面的错误:

public class Equals {
public static void main(String args[]) {
String str1 = new String(“Hello Java!”);
String str2 = new String(“Hello Java!”);
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
}
}


输出结果:
false
true


为什么会出现上面的输出情况呢?==和equals方法之间有什么区别呢?初学的时候对于这个问题是非常疑惑的,如果不提前搞懂,就会导致以后自己编写代码的时候出现一些低级的错误。那么,接下来,我们就一起来看一下equals和==到底有什么区别吧。

  • 关系操作符“==”的比较
    • 首先我们来看一段来自《java编程思想》一书中的话:“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。
      这句话的意思就是:==就是用来比较值是否相等的操作
    • 我们通过几个例子来进行说明:
    • -

public class Equals {
public static void main(String args[]) {
int a = 1;
int b = 1;
System.out.println(a == b);
String str = new String(“许明华”);
String str1 = new String(“许明华”);
String str2 = new String(“许明华”);
System.out.println(str1 == str2);
System.out.println((str1 = str) == (str2 = str));
}
}


输出结果:
true
false
true


解释:首先:a = b这个好理解,a和b的变量存储的值都是1,肯定是相等的。而第二个和第三个就不一样了。要明白这两个我们就必须先了解java中的8种基本数据类型:
-浮点型:float(4 byte),double(8 byte);
-整型:byte(1 byte),short(2 byte),int(4 byte),long(8 byte);
-字符型:char(2 byte);
-布尔型:boolean(JVM规范没有明确规定其所占的空间的大小,仅规定其职能取字面值“true”和“flase”)
对于上述所说的8种基本数据类型的变量,变量是直接存储的“值”,因此在用关系操作符“==”来进行比较的时候,比较的就是其本身的“值”。(要注意浮点型和整形都是有符号的在比较的时候要将符号也进行比较,而char是无符号类型的(char类型取值范围为0-2^16-1))
-即int a = 1;int b = 1;
-变量a和变量b都是直接存储的“1”这个数值,所以用“==”来比较的时候结果是true。
-但是对于非基本数据类型的变量,我们将其叫做引用类型的变量。比如上面的str和str1和str2都是属于引用类型的变量。而非常重要的一点就是引用类型的变量存储的并不是“值”本身,而是与其相关联的对象的内存中的地址
-比如本题中的引用代码中的:
String str;
这句话就声明了一个引用类型的变量,此时它并没有和任何对象关联。而通过new String(“许明华”)这个操作来产生一个对象(也叫作类String的一个实例),并通过这个对象和str1进行对象和地址绑定。
完整的代码:
str = new String(“许明华”);
这个时候str指向了一个对象(也把str叫做对象的引用),此时变量str中存储的就是它指向的对象在内存中的存储地址,并不是“值”本身。所以我们在直接用关系符号来进行比较的时候其实是比较了二者的地址,由于str1和str2是指向不同的对象,也即是二者的实际存储的内存地址是不相同的,所以输出了false
而在第三次进行比较的时候,我们是直接让str1和str2都指向了str,即指向了相同的对象,则它们实际存储的内存地址就肯定是一样的了,所以输出了true。

  • “equals方法”的比较
    • equals()方法进行比较又是比较的什么呢?首先我们知道java中有一个类是所有类的基类:Object类,而equal()方法就是该类的一个方法。所以对于所有继承Object类的类都会有该方法。我们通过直接理解Object类的中的equlas()方法来进行解读:
    • 首先看Object类中的equals()方法的实现:

public boolean equals(Object obj){
return (this == obj);
}
解释:很显然,在Object类中,equals()方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。


但很多人会问,那为什么下面这段代码的输出会是true呢?


String str1 = new String(“许明华”);
String str2 = new String(“许明华”);
System.out.println(str1.equals(str2));
输出:true

要知道为什么,我们就需要来仔细看一下String类中的equals()方法的具体实现了。
通过了解,原来是String类对equals()方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。关于String类重写equals()方法,大家可以自己查阅相关的资料,也可以查看我这里给的链接(关于String类中重写的equals()方法),而其他的一些类,比如Double,Date,Integer等类,都对equals()方法进行了重写,用来比较指向对象的所存储的内容是否相等。

  • 总结
    • 通过看了很多的csdn以及结合自己的实际编程情况,总结出以下几点:
    • 对于“==”:
      • 如果作用于基本数据类型的变量,则直接比较其存储器的“值”是否相等即可;
      • “==”运算符不允许我们进行覆盖操作,也就是说它限制了我们的表达,所以我们才需要用一个equals()方法来进行比较。
    • 对于equals()方法:
      • 首先要注意equals()方法不能作用域基本数据类型的变量;
      • 如果没有对equals()方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
      • 如String、Date等类对equals()方法进行了重写的话,比较的是所指向的对象的内容。

所以还不知道equals方法以及==运算符到底如何使用的童鞋们,快快看过来……


PS:这一个月终于完成了自己的期末考试,现在有更多的时间来玩转csdn了,小伙伴们,我来了…………

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HuaCode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值