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中的对象复制字段值?
++运算符不是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)
它确实允许它,它不会做你认为它做的.
你拥有的是速记.
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)
| 归档时间: |
|
| 查看次数: |
7157 次 |
| 最近记录: |