使用replace和substring方法的字符串相等

时间:2014-02-06 15:18:36

标签: java string replace compare substring

我对字符串比较有一些疑问。我没有找到任何关于替换和子字符串方法的答案。所以这里是代码

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

substring方法是否创建了一个新的String()。如果是这样的话,为什么语句一个为真,而2则不是?同样的问题是关于语句3和4.谢谢。

4 个答案:

答案 0 :(得分:0)

如果将字符串与.equals()(测试值相等)而不是==(测试参照相等性)进行比较,则程序将输出不同的结果。

答案 1 :(得分:0)

您不应该比较java中的字符串。 ==正在比较字符串引用而不是字符串本身。使用已定义的.equals()方法进行字符串质量比较。

str1.equals("Hello");

答案 2 :(得分:0)

我假设你知道字符串比较是如何工作的。所以我会试着解释发生了什么。

java中的字符串是不可变对象,因此一旦创建就无法更改它们。 为了减少一遍又一遍地创建“相同”字符串对象的开销,有一个已经使用/创建的字符串池。 现在,当您现在比较两个字符串对象是否相同时,它会比较对象本身是否相同。如果你执行“hello”.substr(0),它将“创建”一个字符串对象,其中包含“hello”。由于已经使用了“hello”,因此包含“hello”的字符串对象已经在字符串对象池中。如果你现在再次“创建”字符串对象“hello”进行比较,它将从池中返回相同的对象。

同样的情况发生在“hello”.replace(“l”,“l”)它将返回与上面相同的“hello”字符串对象。 但是你不能依赖它,因为字符串池可以随时清空。

进一步阅读“internalling strings”http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#intern()

但是,如果你的问题是关于如何比较字符串本身而不是包含你字符串的对象,你应该使用“hello”.equals(“hello”),因为它会比较真实内容。 (如上所述)

答案 3 :(得分:0)

substring()方法(在Java 7中已更改)将始终返回一个新对象。唯一的例外是它返回整个字符串(substring(0))。然后,它将从池中返回它,并且相等表达式(==)将评估为true。这就是为什么语句1为真,但语句2为假的原因。

An example