string如何获取--出现了两次_SO面试题14:如何比较字符串?

# 问题 我之前一直用 == 操作符来比较两个字符串,但是,我遇到一个bug,最终,通过把 == 替换成 equals 进行修复的。 使用 == 哪里不对呢?到底什么时候用 == ?什么时候用 equals?它们有什么不同呢? # 最佳答案 == 是测试引用是否相同,即判断它们是不是同一个对象。 String#equals () 先来看一下它的源码实现:

4d287d005b8acc895d5184a541400891.png

我们发现,该方法判断的不仅是内容是否相等,而且被比较对象是否是String类型。 String#contentEquals() 还是一样,先来看看源码实现:

99f1456b001a12e8811615e8dc36dc2c.png

再来看看nonSyncContentEquals方法的具体实现:

b702d93bab29fc10362b8c6f5f16e3e6.png

通过源码分析,我们可以发现,它只是比较内容是否相等,不检查被比较对象的类型。 Objects#equals()

b5b8bc1e01d8dab899ae6d5e03c50087.png

通过源码,我们可以发现,这个方法做了判空处理。因此,我们在重写某个对象的equals方法时,如果里面的属性值可能为空时,最好用Objects#equals()来判断。 同时,我发现guava的Objects#equal()也提供了同样的实现,如下图

f0fc409c75c8470e00636a90e8953ef1.png

由于jdk的Objects#equals()是从jdk1.7开始的,估计是后来借鉴guava的实现把。 String#intern() 引出这个方法,不得不提一下String类型的常量池(节约内存,提高速度)。它主要通过两种方式来声明:
  • 直接使用双引号声明出来的String对象会直接存储在常量池中。

  • 如果不是用双引号声明的String对象,可以使用String#intern()从字符串常量池中查询当前字符串是否存在?若不存在就会将当前字符串放入常量池中,再返回;如果存在就会直接返回当前字符串。

接着,我们通过源码发现它是一个native方法:

477b5e99b63a5a6f469daeb28597e1ac.png

这里,就不具体讲解它的内部实现,关于这类型的文章也很多,但是也容易踩坑,比如美团曾分享过一个fastjson的案例:因String#intern()使用不当,导致变慢,感兴趣的可以去搜索一下。 好了,有了上面这些基础知识,那么这道题的答案就明朗了。 如果你要检查两个字符串是否有相同的值,建议使用Objects#equals();如果是常量池中的字符串是否存在,那么,可以用 == 操作符。 具体实例如下:
// These two have the same valuenew String("test").equals("test") // --> true // ... but they are not the same objectnew String("test") == "test" // --> false // ... neither are thesenew String("test") == new String("test") // --> false // ... but these are because literals are interned by // the compiler and thus refer to the same object"test" == "test" // --> true // ... string literals are concatenated by the compiler// and the results are interned."test" == "te" + "st" // --> true// ... but you should really just call Objects.equals()Objects.equals("test", new String("test")) // --> trueObjects.equals(null, "test") // --> falseObjects.equals(null, null) // --> trueString s1 = "testString";String s2 = new String("testString");         System.out.println(s1==s2.intern()); // trueString s3 = new String("testString"); System.out.println(s2.intern()==s3.intern());// true
今天的技能,你get到了吗?要不转发一波支持一下~~~
stackoverflow来源:https://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java

 往期推荐 

?

  • SO面试题13:如何便捷地将两个数组合到一起?
  • Java中的文件锁到底是怎么回事?
  • IDEA太强悍了,调试器竟然支持实时数据流分析啦,提前知道代码怎么跑的?

cd3a1e3279eec6dd472556cd626664cb.png

cfd547e14440d4babbfcfc0e9aea7ca6.gif 

点击

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值