【问题标题】:Difference between str.replaceAll() and str = str.replaceAll() [duplicate]str.replaceAll() 和 str = str.replaceAll() 之间的区别 [重复]
【发布时间】:2016-08-05 22:45:28
【问题描述】:

有什么区别

str.replaceAll(); //1

str = str.replaceAll(); //2

当我尝试第一个时,编译器没有给出错误,但字符串根本没有改变,但第二个工作正常。第一个是做什么的? 下面的示例代码:

    String str = "abcdefgh";
    str.replaceAll("abcd", ""); //1st replacement
    System.out.println(str);
    str = str.replaceAll("abcd", ""); //2nd replacement
    System.out.println(str); 

第一个之后的输出是

abcdefgh

第二个之后是

efgh

我知道我们应该使用第二个,因为它会更新但仍然不是 String 对象?我们就像为它调用 replaceAll() 方法,它应该改变它,但为什么没有呢?任何想法将不胜感激。

【问题讨论】:

  • 字符串是不可变的。请参阅链接的问题。
  • 第一次调用完成这项工作并把结果扔掉,你读过javadoc吗?

标签: java string replace


【解决方案1】:

str.replaceAll("abcd", "") 不会修改源String,因为Strings 是不可变的。相反,它会创建一个新的String 并返回它。这就是您必须将返回的String 分配回str 的原因。

【讨论】:

  • @Tunaki 我明白了,好的。
【解决方案2】:

区别与i + 3;i = i + 3 相同。第一个做了一些事情,基本上把结果扔掉了。第二个将结果存储在变量中。

【讨论】:

  • 但是先生 i + 3;给出错误但 str.replaceAll() 没有。为什么编译器会生成无用的结果并扔掉?
  • @Geek 编译器可能不会那样做,但你要求它这样做
  • 是的,编译器不会只接受这个语句,但我认为它会传达这个想法。问题是你在字符串上调用了一个方法。正如其他人在这里已经提到的那样,字符串是不可变的(意味着它们不能更改)。您的方法将创建一个新字符串,但它尚未存储在任何变量中。要存储结果,您需要执行 str = /**/ 部分。
  • 那是因为i + 3 是一个表达式,而str.replaceAll(...) 既是一个表达式又是一个语句,因为它在实例上调用一个方法。
猜你喜欢
  • 2021-08-15
  • 2019-04-27
  • 1970-01-01
  • 2016-10-07
  • 2014-08-16
  • 2011-04-08
  • 2012-11-24
  • 2013-06-05
  • 2021-09-29
相关资源
最近更新 更多