簡體   English   中英

為什么for-each循環不允許增量整數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM