首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是什么让引用比较(==)适用于Java中的某些字符串?

是什么让引用比较(==)适用于Java中的某些字符串?
EN

Stack Overflow用户
提问于 2012-03-14 16:31:24
回答 2查看 12.8K关注 0票数 63

我有下面几行代码来比较字符串。str1不等于str2,这是可以理解的,因为它比较了对象引用。但是为什么s1等同于s2呢?

String s1 = "abc";
String s2 = "abc";

String str1 = new String("abc");
String str2 = new String("abc");

if (s1==s2)
    System.out.println("s1==s2");           
else
    System.out.println("s1!=s2");

if (str1==str2)
    System.out.println("str1==str2");           
else
    System.out.println("str1!=str2");

if (s1==str1)
    System.out.println("str1==s1");         
else
    System.out.println("str1!=s1");

输出:

  s1==s2
  str1!=str2
  str1!=s1 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-14 16:34:25

字符串常量池实际上将缓存所有字符串文字,因此它们在下面是相同的对象,这就是为什么您会看到为s1==s2所做的输出。它本质上是VM中的一个优化,以避免每次声明文字时都创建一个新的string对象,这可能很快就会变得非常昂贵!在您的str1==str2示例中,您显式地告诉VM创建新的string对象,因此它为false。

顺便说一句,对任何字符串调用intern()方法都会将其添加到常量池中,只要对应的字符串还不存在(并返回添加到常量池中的字符串)。但是,这样做并不一定是一个好主意,除非你确定你正在处理的字符串肯定会被用作常量,否则你可能最终会很难追踪到内存泄漏。

票数 87
EN

Stack Overflow用户

发布于 2012-03-14 16:35:42

在Java中,相同的常量字符串将被重用。因此s1s2指向相同"abc“对象和s1==s2。但是当您使用new String("abc")时,会创建另一个对象。所以s1 != str1

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9698260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档