当心:我不想比较字符是否相等。因为我知道如何使用 String.equals() 方法。这个问题是关于字符串参考的
当我开始学习 String 类及其属性为不变性等时,我正在为 OCA 考试学习。根据我阅读或可能理解的关于字符串池的内容,当创建字符串时,Java 将此对象存储在他们调用的对象上字符串池,如果使用相同的值创建一个新字符串,它将引用字符串池中的字符串,除非我们使用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()
在字符串池的引用上