Java,使用foreach循环将修改后的字符串添加到ArrayList

时间:2010-08-06 15:42:27

标签: java

我正在遍历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。

5 个答案:

答案 0 :(得分:3)

是的,字符串是不可变的。所以打电话给......

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

执行此行后,s是一个全新的字符串,而不是您开始使用的字符串。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

原始列表未更改。

你的“s”变量是循环的局部变量,在进入body循环时它引用原始列表中的字符串,但是s.replace()返回对新String的引用。

答案 4 :(得分:0)

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

您可以自己查看对象实际上是否相同或不使用“==”运算符,该运算符在对象上使用时比较引用。由于String是一个对象,它具有这种引用比较行为,但由于java实习字符串有时会混淆,因为在很多情况下,两个相等的字符串实际上是指同一个对象。