[英]Using for-each over an array of Objects - “Integer[] array” - Why Does “for(int i : array)” Work?
[英]Why for-each loop does not allow increment 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))
返回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))
上面的代碼不是最佳的; 但它不使用自動裝箱。 一個優化的解決方案將使用ListIterator(按需求添加):^)
ListIterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
iterator.set(iterator.get()++);
}
請注意,此循環大量使用自動裝箱,如果您希望了解自動裝箱的本質,則下面介紹的等效解決方案不依賴任何自動裝箱。
ListIterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
iterator.set(Integer.valueOf(iterator.get().intValue()++));
}
Integer
是不可變的。
您的代碼將i
變量更改為指向具有更大值的全新Integer
實例。
列表中的原始Integer
實例未更改(並且無法更改)。
它確實允許它,但它並沒有按照您的想法做。
您所擁有的是簡寫。
for (Iterator<Integer> iter = list.iterator(); iter.hashNext();) {
Integer i = iter.next();
i++; // value is discarded after this line.
}
編輯:而不是使用get(i)和set(i,value)(對於LinkedList而言可能非常昂貴),更好的選擇是使用ListIterator。
for (ListIterator<Integer> iter = list.listIterator(); iter.hasNext();)
iter.set(iter.next()+1);
因為列表中的第0個元素是“ 1”,所以您在第2行中添加了該元素。
哦,我明白了:您想增加整數。 你必須做:
for( int i=0; i<list.size(); i++ ) {
list.set(i,list.get(i)+1);
}
請注意,整數實例是不可變的。 該值不能更改!
因為Integer
是不可變的,就像String
等。
整數上的運算符++
就像這樣做:
i = new Integer(i.intValue()+1);`
您需要list.set(index, i);
修改列表中的值。
for (int index=0; index<list.size(); index++) {
list.set(index, list.get(index)+1);
}
由於所有答案都是關於不變性的,因此這里是可變類型的外觀:
import java.util.concurrent.AtomicInteger;
List<AtomicInteger> list = new LinkedList<AtomicInteger>();
list.add(new AtomicInteger(1));
list.add(new AtomicInteger(2));
list.add(new AtomicInteger(3));
for (AtomicInteger i : list)
i.getAndIncrement();
System.out.println(list.get(0));
這應該輸出2
。 (AtomicInteger還具有這些線程安全屬性,但在這里我們僅需要可變性。)
基本類型int
(與所有基本類型一樣)也是不可變的,因此以下變體仍將輸出1
:
int[] list = new int[]{ 1, 2, 3};
for (int i : list)
i++;
System.out.println(list[0]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.