【问题标题】:String equality using replace and substring methods使用替换和子字符串方法的字符串相等
【发布时间】:2014-03-03 15:04:48
【问题描述】:

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

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()。如果是,为什么语句 1 为真,而语句 2 不成立?语句 3 和 4 也有同样的问题。谢谢。

【问题讨论】:

标签: java string replace compare substring


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    str1.equals("Hello");
    

    【讨论】:

    • 在java中,String是不可变的,所以像replace、substring这样的方法总是会创建一个新的String对象
    • 为什么陈述 1 是真的?
    • 这可能是由于编译器的优化,编译器看到语句 1 和 3 基本上没有对字符串做任何事情,因此返回与结果相同的字符串。
    【解决方案3】:

    我假设您知道字符串比较的工作原理。所以我会试着解释发生了什么。

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

    "hello".replace("l","l") 也是如此,它将返回与上面相同的“hello”字符串对象。 但你不能依赖它,因为字符串池随时可能被清空。

    进一步阅读“内部字符串”http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#intern()

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

    【讨论】:

    • 谢谢。我想我明白了。
    【解决方案4】:

    substring() 方法(在 Java 7 中已更改)将始终返回一个新对象。唯一的例外是返回整个字符串 (substring(0))。然后,它将从池中返回它,等式表达式 (==) 的计算结果为 true。这就是为什么陈述 1 为真,而陈述 2 为假的原因。

    An example.

    【讨论】:

      猜你喜欢
      • 2017-03-23
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 2012-09-25
      • 2020-08-31
      相关资源
      最近更新 更多