栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java中字符串比较的小坑

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/846078.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号