我正在遍历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。
答案 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实习字符串有时会混淆,因为在很多情况下,两个相等的字符串实际上是指同一个对象。