【发布时间】:2017-05-18 02:17:27
【问题描述】:
注意:我不是要比较字符是否相等。因为我知道如何使用 String.equals() 方法。这个问题是关于字符串参考
当我开始学习 String 类及其属性为不变性等时,我正在为 OCA 考试学习。根据我对 String pool 的阅读或可能理解的是,当一个字符串Java 将此对象存储在他们所谓的 String pool 上,如果创建了具有相同值的新字符串,它将引用 String pool 上的字符串除了我们使用 new 关键字的情况,因为这会创建一个新的引用,即使两个字符串都包含相同的值。
例如:
String a = "foo";
String b = "foo";
String c = new String("foo");
boolean ab = (a == b); // This return true
boolean ac = (a == c); // This return false
要清楚这段代码的作用是在第一行代码中创建 String a = "foo" 并将其存储在 字符串池 中,然后在第二行代码中创建String b 和对 "foo" 的引用,因为它已经存在于 字符串池 中。但是第 3 行将创建这个字符串的新引用,无论它是否已经存在。这是一个关于正在发生的事情的小图形示例:
问题出在以下几行代码上。当通过连接创建字符串时,java 是否会做出不同的东西或简单的 == 比较器有另一种行为?
示例 A:
String a = "hello" + " world!";
String b = "hello world!";
boolean compare = (a == b); // This return true
示例 B:
a = "hello";
b = "hel" + "lo";
compare = (a == b); // This return true
示例 C:
a = "Bye";
a += " bye!";
b = "Bye bye!";
compare = (a == b); // This return false
观看代码运行:(http://ideone.com/fdk6KL)
发生了什么?
编辑
修复示例 B 中的错误:
b = 'hel' + 'lo'添加有关问题的说明。这不是比较问题,因为我知道
String.equals()的使用问题出在字符串池的引用上
【问题讨论】:
-
字符串无法与“==”进行比较,条件如何为真?
-
@NathanHughes 更多的是个人知识。但是你有一个很好的观点
-
字符串池不会被添加到每一个小连接中 - 想象一个循环,有人打印
"Some Text" + i + "."一千次。您认为这值得在字符串池中添加数千个条目吗? -
任何创建新
String实例的表达式(例如new String(...)的调用或串联)都会创建一个新的、非实习的String实例。 “字符串文字 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用方法String.intern共享唯一实例。” docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5 否则必须明确调用intern。阅读精美手册。 -
我想你想了解一下编译时常量这个术语。
标签: java string string-comparison object-reference string-pool