为什么for-each循环不允许增加Integer?

rll*_*rll 1 java foreach integer

我的意思是在这段代码中:

List<Integer> list = new LinkedList();
list.add(1);
list.add(2);
list.add(3);

for (Integer i : list)
    i++;

System.out.println(list.get(0))
Run Code Online (Sandbox Code Playgroud)

返回1而不是2.在for-each循环中,Java创建新对象(i)并从List中的对象复制字段值?

Edw*_*uck 9

++运算符不是Integer对象上的有效运算符,因此Java使用它的自动装箱功能将Integer对象转换为int原语.转换后,int原语会递增.您不保存原语以使其丢失.

为了达到目标,你需要做一些事情

List<Integer> list = new LinkedList();
list.add(1);
list.add(2);
list.add(3);


for (int index; index < list.size(); index++) {
   int value = list.get(index).intValue();
   value++;
   list.set(index, Integer.valueOf(value));
}

System.out.println(list.get(0))
Run Code Online (Sandbox Code Playgroud)

上面的代码不是最优的; 但它不使用自动装箱.优化的解决方案将使用ListIterator(按流行需求添加):^)

ListIterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
  iterator.set(iterator.get()++);
}
Run Code Online (Sandbox Code Playgroud)

请注意,此循环使用自动装箱很多,如果您想了解自动装箱在封面下做什么,下面提供的等效解决方案不依赖于任何自动装箱.

ListIterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
  iterator.set(Integer.valueOf(iterator.get().intValue()++));
}
Run Code Online (Sandbox Code Playgroud)

  • `++`**是'Integer`上的有效运算符,它修改变量以引用比前一个更高的`Integer`.这不起作用的真正原因是`Integer`是不可变的,`++`只创建一个新版本. (2认同)

SLa*_*aks 8

Integers是不可改变的.

您的代码将i变量更改为指向Integer具有更大值的全新实例.

Integer列表中的原始实例不会(也不能)更改.


Pet*_*rey 7

它确实允许它,它不会做你认为它做的.

你拥有的是速记.

for (Iterator<Integer> iter = list.iterator(); iter.hashNext();) {
    Integer i = iter.next();
    i++; // value is discarded after this line.
}
Run Code Online (Sandbox Code Playgroud)

编辑:而不是使用get(i)和set(i,value),这对于LinkedList来说可能非常昂贵,更好的选择是使用ListIterator.

for (ListIterator<Integer> iter = list.listIterator(); iter.hasNext();)
    iter.set(iter.next()+1);
Run Code Online (Sandbox Code Playgroud)

  • +1使用迭代器确实是最好的解决方案. (2认同)