2010-08-06 20 views
1

我遍历ArrayList,修改字符串,并试图将其添加到新的列表。它不会更改原始列表。在Java的foreach循环中,是否创建了对象的副本,以便我可以添加它?Java,将修改后的字符串添加到ArrayList与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

它不应该改变原来的列表。你想要吗? – NullUserException 2010-08-06 15:44:44

+0

你的评论说lineOfWords是一个字符串?根据你的描述,它不应​​该是ArrayList 吗? – Nicolas78 2010-08-06 15:45:41

回答

0

您的原始列表未更改。

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

3

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

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

这一行执行后,s是一个全新的字符串,而不是你开始与一个。我们希望lineOfWords是String对象的数组吗?不是“一个包含文本的字符串”。

1

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

0

是的,作为字符串是免疫的任何修改它的操作实际上创建它的一个副本,并在你的循环分配它的's'不会改变列表的原始内容。

0

您正在创建一个新的String对象,当你进行替换操作 - 如Java中的字符串是不可变的。

您可以看到自己当对象是实际使用“==”操作,在对象上使用时比较引用相同与否。由于String是一个对象,因此它具有此引用比较行为,但由于java实习字符串有时会引起混淆,因此在许多情况下,两个相同的字符串实际上是指同一对象。

相关问题