繁体   English   中英

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

[英]Java, adding modified string to ArrayList with foreach loop

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

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

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

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

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

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

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

你原来的名单没有变化。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM