首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >关于java字符串的问题

关于java字符串的问题
EN

Stack Overflow用户
提问于 2018-08-06 05:48:22
回答 2查看 80关注 0票数 -3

(真或假)假设字符串对象b和c包含相同的字符序列。则b == c为真。

代码语言:javascript
复制
public static void main(String[] args) {
    String a = "abc";
    String b = "abc";

    System.out.println(a == b);
    System.out.println(a.equals(b));
}

结果是正确的,但问题的答案是错误的。我想知道为什么。

EN

回答 2

Stack Overflow用户

发布于 2018-08-06 05:56:38

代码语言:javascript
复制
public static void main(String[] args) {
    String a = new String("abc");
    String b = new String("abc");

    System.out.println(a.equals(b));
    System.out.println(a == b);
}

依次打印truefalse。因此,具有相同字符序列的两个字符串必须相互equal,但可以相互==,也可以不彼此。

显然,在所有情况下都是a == a,而a是一个包含与a相同的字符序列的String

但在上面的例子中,我们创建了两个不同的实例,它们恰好包含相同的字符序列。因此就有了a != b

那么在你的例子中发生了什么呢?String interning

任何字符串文字都由编译器分配到一个特殊的池中,并且任何重复的文字都共享相同的引用。因此,即使文字被定义了两次,但就编译器而言,它们是同一个实例。

票数 4
EN

Stack Overflow用户

发布于 2018-08-06 05:54:15

测试结果为true的原因是JVM喜欢做的一件非常奇怪的事情。因为您已经定义了两个String文字,所以JVM将决定存储其中一个值,并让a和b引用相同的字符串。这就是为什么在true中进行==比较的原因。

正如其他人所说,执行String b = new String("abc");将强制生成一个新的String文本,这将是一个单独的内存块。因此,==比较将导致false

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

https://stackoverflow.com/questions/51698499

复制
相关文章

相似问题

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