Java中字符串比较的坑

目录

前言

String使用 "==" 比较的内容

如何比较字符串的内容

总结:


前言

先来看一个有趣的现象:

str,str2,str3这三个字符串的内容都是hello,为什么比较的结果,一个是true,另一个却是false呢?

这需要解释一下str,str2和str3在内存中分别是如何存储的了;直接上图:

从上图可以看见呢,str和str2是指向同一个对象的,此时的 hello 这样的字符串常量是在字符串常量池当中的;而str和str3在内存中却是下图这样的.

为什么str3不是跟str和str2指向同一个内存对象呢?

因为str3的创建方式是: String str3 = new String("hello");而这样的创建方式创建的String对象相当于在堆上另外开辟了空间来存储 "hello"的内容,也就是说,当下内存中存在两份的 "hello".

String使用 "==" 比较的内容

了解了str str2 str3在内存中存储的关系之后,我们再来说一下使用 "==" 比较字符串会出现什么情况?

有同学会问,str str2 str3 的内容不都是"hello"吗?为什么输出的结果却不一样;

原因就在于String使用 "==" 比较的并不是字符串的内容,而是比较两个引用是否指向同一个对象;

就如上图所示,str 和 srt2 都指向同一个对象,所以 System.out.println(str == str2) 的结果自然为true;

而 str 和 str3 并不是指向同一个对象,System.out.println(str == str3) 输出的结果就自然为false了.

如何比较字符串的内容

在java中想要比较字符串的内容,必须要采用String类提供的equals方法;

equals方法使用的注意项:

                把有可能为null的对象放在equals后面,这样可以避免异常

总结:

字符串常量池里面的内容是不重复的;

所以当str2在创建字符串 " hello "  的时候会先看看字符串常量池中是否有相同的字符串;如果有,则把引用返回给str2;

因此str和str2都指向字符串常量池中的同一个 "hello" 对象,那么str 和 str2 所存储的引用也就是相同的了,用 "==" 比较的时候就会得到结果true;

而str3 会在堆区new一个String 对象,不在字符串常量池中,所以用 "==" 比较str和str3的引用时,返回的结果就为false

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值