淺談foreach寫失效的問題
Java中的細節(jié)一定要清楚,否則非常容易出現(xiàn)問題。例如這個場景:遍歷一個集合,對符合某種條件的元素做修改。大家往往會寫出如下代碼:
public class JavaTest
{
public static void main(String[] args)
{
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
for (Integer temp : list)
{
if (temp == 1)
{
temp = temp * 2;
}
}
for (Integer a : list)
{
System.out.println(a);
}
}
}
期待的結果是:
2
2
3
但實際輸出為:
1
2
3
這是很容易掉進去的陷阱。即通過foreach遍歷對集合元素進行修改。在以為變更已發(fā)生的時候,其實變更沒有發(fā)生。造成數(shù)據(jù)寫入失敗。因為
for (Integer temp : list)
{
if (temp == 1)
{
temp = temp * 2;
}
}
根據(jù)oracle的官方文檔,正式翻譯應該如下
for (Iterator i = list.iterator(); i.hasNext(); )
{
float i0 = (Integer)i.next();
if(i0 == 1)
i0 = i0*2;
}
即:foreach里頭的的 temp變量只是一個局部變量,而且還是集合中元素的一個副本,并不是元素本身。
我自己也試了一下,是有一個副本的代碼如下:

反編譯代碼如下:

以上這篇淺談foreach寫失效的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
一文搞懂spring boot本地事務@Transactional參數(shù)
SpringBoot整合Mybatis實現(xiàn)多數(shù)據(jù)源配置與跨數(shù)據(jù)源事務實例
Spring Boot Maven Plugin打包異常解決方案

