我有一些有关字符串比较的问题。
public static void main(String args[]) {
if ("hello".substring(0) == "hello")
System.out.println("statement 1 is true");
if ("hello".substring(1) == "ello")
System.out.println("statement 2 is true");
if ("hello".replace('l', 'l') == "hello")
System.out.println("statement 3 is true");
if ("hello".replace('h', 'H') == "Hello")
System.out.println("statement 4 is true");
if ("hello".replace('h', 'H') == "hello".replace('h', 'H'))
System.out.println("statement 5 is true");
}
输出为:
statement 1 is true
statement 3 is true
子字符串方法是否创建一个新的string()。如果是的话,为什么语句是正确的,而2却不是相同的问题。
我假设您知道字符串比较的工作方式。因此,我将尝试解释正在发生的事情。
Java中的字符串是不变的对象,因此一旦创建,您就无法更改它们。为了一遍又一遍地创建"相同"字符串对象时的开销,有一个已经使用/创建的字符串池。现在,当您比较两个字符串对象是否相同时,它会比较对象本身是否相同。如果您执行" hello" .substr(0),则会在其中"创建"一个带有" Hello"的字符串对象。由于已经使用了" Hello",因此包含" Hello"的字符串对象已经在字符串对象池中。如果您现在再次"创建"字符串对象" Hello"以进行比较,则它将从池中返回相同的对象。
" Hello" .replace(" L"," L")也会发生同样的情况,它将像上面一样返回相同的" Hello"字符串对象。但是您不能依靠这一点,因为弦池可以随时被清空。
进一步阅读"固定字符串" http://docs.oracle.com/javase/6/docs/api/java/lang/lang/string.html#intern()
但是,如果您的问题是关于如何比较字符串自己而不是包含字符串的对象,则应真正使用" Hello" .equals(" Hello"),因为它将比较真实的内容。(如上所述)
如果将字符串与.equals()
(测试值等于)而不是==
(测试参考等效性)进行比较,则您的程序将输出不同的结果。
您不应比较Java中的字符串。==是比较字符串引用,而不是字符串本身。使用已经定义的.equals()
方法用于字符串的质量比较。
str1.equals("Hello");
substring()
方法(在Java 7中更改)将始终返回一个新对象。唯一的例外是如果要返回整个字符串(substring(0)
)。然后,它将从池中返回它,而平等表达式(==
)将评估为true。这就是语句1为真的原因,但是语句2 false。
一个例子。