【问题标题】:Java, adding modified string to ArrayList with foreach loopJava,使用 foreach 循环将修改后的字符串添加到 ArrayList
【发布时间】:2010-08-07 00:07:59
【问题描述】:

我正在遍历 ArrayList,修改字符串,并尝试将其添加到新列表中。它不会更改原始列表。在 Java 的 foreach 循环中,它是否会创建对象的副本以便我可以添加它?

List<String> newString = new ArrayList<String>(); 
for (String s : lineOfWords {  // lineOfWords is a String that has text in it
   s = s.replaceAll("\\b(\\w+)\\b(\\s+\\1)+\\b", "$1"); 
   newString.add(s); 
}  

提前致谢!

编辑:我的意思不是要它更改原始字符串,而是将新字符串(在本例中为 s)添加到我的 newString ArrayList。

【问题讨论】:

  • 不应更改原始列表。你想要那个吗?
  • 您的评论说 lineOfWords 是一个字符串?根据您的描述,不应该是 ArrayList 吗?

标签: java


【解决方案1】:

是的,字符串是不可变的。因此,调用...

s = s.replaceAll("\\b(\\w+)\\b(\\s+\\1)+\\b", "$1"); 

在这一行执行之后,s 是一个全新的字符串,而不是你开始使用的那个。

更新 我希望lineOfWords 是一个字符串对象数组?不是“其中包含文本的字符串”。

【讨论】:

    【解决方案2】:

    是的,每次调用s.replaceAll 时都会创建一个新的字符串对象。然后,您将该新 String 对象分配给临时变量 s,这对您之前添加到 List 的任何字符串或原始 List 中的任何字符串都没有影响。

    【讨论】:

      【解决方案3】:

      你原来的列表没有改变。

      您的“s”变量是循环的本地变量,在进入主体循环时,它引用原始列表中的字符串,但随后 s.replace() 将返回对新字符串的引用。

      【讨论】:

        【解决方案4】:

        是的,因为 String 是不可变的,对其进行修改的任何操作实际上都会创建它的副本,并且在您的循环中将其分配给 's' 不会更改列表的原始内容。

        【讨论】:

          【解决方案5】:

          当您执行替换操作时,您正在创建一个新的字符串对象 - 因为 Java 中的字符串是不可变的。

          您可以使用“==”运算符亲自查看对象何时实际相同或不同,该运算符在对象上使用时比较引用。由于 String 是一个对象,它具有这种引用比较行为,但有时会因为 java 中间字符串而感到困惑,因为在许多情况下,两个相等的字符串实际上是指同一个对象。

          【讨论】:

            猜你喜欢
            • 2022-11-30
            • 2014-04-17
            • 2015-04-09
            • 2013-08-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多