字符串类型的对比

字符串类型的对比

​String str1="Animal";
String str2="Animal";
System.out.println("str1 与 str2 :"+str1.equals(str2));//n1 true
System.out.println("str1 与 str2 :"+(str1==str2));//n2 true
System.out.println("=====================");
String str3=new String("Animal");
String str4=new String("Animal");
System.out.println("str1 与 str2 :"+str3.equals(str4));//n3 true
System.out.println("str1 与 str2 :"+(str3==str4));//n4 false


为什么String直接赋值与new创建的相同字符串,使用==对比的时候返回值不一样呢?(n2与n4处打印值)

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,

1、String str = "xxx";以这种方式赋值时,JVM会先从字符串常量池中查询是否存在"xxx"这个对象,

如果存在,直接把常量池中"xxx"的地址返回给str。如果不存在,则会在常量池中创建"xxx"对象,并把该对象的地址返回给str。

​所以通过==比较时,str1,str2指向的是同一地址,所以返回true;

2、String str3=new String("xxx");以这种方式赋值时,JVM会先从字符串常量池中查询是否存在"xxx"这个对象,

若不存在则会在常量池中创建"xxx"对象,同时在堆中创建"xxx"这个对象,然后将堆中的这个对象的地址返回赋给引用str3。

常量池存在则直接在堆中创建"xxx"这个对象,然后将堆中的这个对象的地址返回赋给引用str3。

这时str3和str4分别指向堆中不同的地址,所以返回false; 

祝学习愉快~

  • http://img1.sycdn.imooc.com//climg/60a5e08309fa4e3f15980468.jpg

    如果是这样的话,equals和==的结果不应该是一样的吗(都比较堆中的地址),创建了两个新的对象,地址肯定不一样啊,不因该都是false吗,为什么equals是true呢

    2021-05-20 12:09:40
  • 同学你好,String类型比较不同对象内容是否相同时,应使用equals,若两个String类型对象的内容是相等的,那么得到的结果就是true,如下所示:

    http://img1.sycdn.imooc.com//climg/60a6078709d3629505540247.jpg

    str和str1都为new出来的对象,各占有一块内存空间,所以内存地址不同,但是字符串内容相同。

    祝学习愉快~

    2021-05-20 14:54:35
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师