"= =" 和equals()的区别

Java程序中,要比较两个对象是否相等,经常会使用到“= =”和“equals”,那么什么时候我们用“= =”,什么时候用“equals”呢?这其实就是让我们来看看这两个比较方法的区别。在这里,最让我们搞混淆的是在String里面的比较,首先我们来看个例子:

public class Test01 {

public static void main(String args[]){

String str1="abc";

String str2="abc";

String str3=new String("abc");

if(str1==str2){

System.out.println("str1==str2");

}

if(str1==str3){

System.out.println("str1==str3");

}

if(str2==str3){

System.out.println("str2==str3");

}

}

}

程序结果:str1==str2

从结果可以看出,只有第一个if语句执行了,后面两个都没有,这也就是说:str1str2是相同的,而str3是跟这两个不同的。这是为什们呢?首先我们来看“str1==str2”这个问题,因为程序在运行时会创建一个字符串缓冲池,当使用Sring str2="abc",程序首先会在这个String缓冲池中寻找相同值的对象,而str1被放到了池中,所以在str2被创建的时候,程序找到了具有相同值的str1。在看“str3”为什么与“str1”“str2”不同,是因为在定义str3的时候,我们使用了new关键字,当类类型在创建对象时使用了new关键字,会在堆内存中开辟一个新的空间,从而来存储其内容,而“==”比较的是其堆内存地址,故str3与前两个是不同的。

这时,我们变一下,用“equals()”来比较,代码如下:

public class Test02 {

public static void main(String args[]){

String str1="abc";

String str2=new String("abc");

String str3=new String("abc");

if(str1.equals(str2)){

System.out.println("str1==str2");

}

if(str1.equals(str3)){

System.out.println("str1==str3");

}

if(str2.equals(str3)){

System.out.println("str2==str3");

}

}

}

结果为;str1==str2

str1==str3

str2==str3

从结果我们可以看出,这三个用equals()方法来比较的时候,都相等。这是因为,equals()比较的是这三个对象中在堆内存中的内容是否一样,不是比较地址,而我们定义这三个变量的时候赋的值是一样的,所以这三个用equals()方法比较的时候,结果都为true

我们在看一个例子,自定义一个Student

public class Student {

public Student(String name){

this.getName();

};

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

再来测试这个类:

public class Test03 {

public static void main(String args[]){

Student stu1=new Student("张三");

Student stu2=new Student("张三");

if(stu1.equals(stu2)){

System.out.println("两个学生相同!");

}

else{

System.out.println("两个学生不相同!");

}

}

}

程序结果为:两个学生不相同!

这个时候我们可能就会产生疑问了,不是说equals()比较的堆内存内容吗,为什么stu1.equals(stu2)的结果是false呢?看过API文档应该了解,equals()方法是Object这个类中,而String这个类是重写过这个方法的(在这里就不贴代码啦,大家可以自己去看文档),所以在String类中的equals()方法是比较两个变量的值。而我们自定义的Student类中,equals()方法是从Object这个继承过来的,也就是比较两个对象是否相等,很明显都是用new关键字来定义,肯定是不同的,所以结果为false

<!--EndFragment-->

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值