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

Java,使用foreach循环将修改后的字符串添加到ArrayList,java,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+)\

我正在遍历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是一个全新的字符串,而不是您开始使用的字符串

更新
我希望LineOfWord是字符串对象的数组?不是包含文本的字符串。

是的,字符串是不可变的。因此,随着对

s = s.replaceAll("\\b(\\w+)\\b(\\s+\\1)+\\b", "$1"); 
执行这一行后,s是一个全新的字符串,而不是您开始使用的字符串

更新
我希望LineOfWord是字符串对象的数组?不是包含文本的字符串。

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

是的,每次调用s.replaceAll时都会创建一个新字符串对象。然后将新字符串对象指定给临时变量s,它对您以前添加到列表中的任何字符串或原始列表中的任何字符串都没有影响。

是,因为字符串是不可更改的。对它进行修改的任何操作实际上都会创建它的副本,并且在循环中将它指定给“s”不会更改列表的原始内容。

是,因为字符串是不可更改的对其进行修改的操作实际上会创建其副本,并且在循环中将其指定给“s”不会更改列表的原始内容。

原始列表不变


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

原始列表未更改


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

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


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

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


您可以使用==运算符亲自查看对象何时实际相同或不相同,该运算符在对象上使用时比较引用。由于String是一个对象,所以它具有这种引用比较行为,但有时会因为java将字符串插入而混淆,因为在许多情况下,两个相等的字符串实际上引用同一个对象。

不应更改原始列表。你想要吗?你的评论说LineOfWord是字符串?根据你的描述,它不应该是ArrayList吗?它不应该更改原始列表。你想要吗?你的评论说LineOfWord是字符串?根据你的描述,它不应该是ArrayList吗?