使用modyfing String迭代List

我无法通过这种方式修改List的元素:

for (String s : list) { s = "x" + s; } 

执行后,此列表的这些代码元素不变。如何通过List以最简单的方式实现迭代迭代。

由于String对象是不可变的,因此您无法更改要迭代的值。 此外,您无法修改在此循环中迭代的列表。 执行此操作的唯一方法是使用标准循环迭代列表索引或使用ListIterator接口:

 for (int i = 0; i < list.size(); i++) { list.set(i, "x" + list.get(i)); } for (ListIterator i = list.listIterator(); i.hasNext(); ) { i.set("x" + i.next()); } 

字符串是不可变的野兽,所以我可以建议遵循这个理念并创建新的列表而不是修改一个:

 List mappedList = new ArrayList(); for (String s : list) { mappedList.add("x" + s); } 

我相信,这将使您的代码更易于理解和维护。

这样的事情应该做的工作:

 public static void main(String[] args) throws Exception { final List lst = Arrays.asList("a", "b", "c"); for(final ListIterator iter = lst.listIterator(); iter.hasNext(); ) { final String s = iter.next(); iter.set(s + "x"); } System.out.println(lst); } 

Java字符串是不可变的,因此无法修改它们。 此外,如果要修改列表,请使用迭代器接口。

正如其他人指出的那样:

  • 您无法在Java中修改字符串,因此s = "x" + s将创建一个新字符串(不会包含在列表中)
  • 即使可以,变量s也是局部变量,当分配给它时,它不会影响列表中包含的值。

在这种情况下,解决方案是使用StringBuilder ,它表示您可以实际修改的字符串,或者使用ListIterator作为@Michael Borgwardt和@jarnbjo指出。


使用StringBuilder

 List someStrings = new LinkedList(); someStrings.add(new StringBuilder("hello")); someStrings.add(new StringBuilder("world")); for (StringBuilder s : someStrings) s.insert(0, "x"); 

使用ListIterator

 List someStrings = new LinkedList(); someStrings.add("hello"); someStrings.add("world"); for (ListIterator iter = someStrings.listIterator(); iter.hasNext();) iter.set("x" + iter.next()); 

ideone.com演示

在你的循环中,你只是修改String的本地副本。 更好的选择是使用列表的迭代器,并替换列表的当前位置。

编辑,糟糕,慢慢来。

您不能以这种方式修改ListString元素,但StringBuilder可以正常工作:

 for (StringBuilder sb : list) sb.append("x"); 

对于其他原始vs参考情况和for-each循环也是如此。 在循环中, Iterable是不可变的,但是其中的项的状态不是 – 原语(如String )没有状态,因此你只修改本地副本,但引用可以有状态,因此你可以改变它们通过他们可能具有的任何mutator方法(例如, sb.append("x") )。