淺談foreach寫(xiě)失效的問(wèn)題
Java中的細(xì)節(jié)一定要清楚,否則非常容易出現(xiàn)問(wèn)題。例如這個(gè)場(chǎng)景:遍歷一個(gè)集合,對(duì)符合某種條件的元素做修改。大家往往會(huì)寫(xiě)出如下代碼:
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);
}
}
}
期待的結(jié)果是:
2
2
3
但實(shí)際輸出為:
1
2
3
這是很容易掉進(jìn)去的陷阱。即通過(guò)foreach遍歷對(duì)集合元素進(jìn)行修改。在以為變更已發(fā)生的時(shí)候,其實(shí)變更沒(méi)有發(fā)生。造成數(shù)據(jù)寫(xiě)入失敗。因?yàn)?/p>
for (Integer temp : list)
{
if (temp == 1)
{
temp = temp * 2;
}
}
根據(jù)oracle的官方文檔,正式翻譯應(yīng)該如下
for (Iterator i = list.iterator(); i.hasNext(); )
{
float i0 = (Integer)i.next();
if(i0 == 1)
i0 = i0*2;
}
即:foreach里頭的的 temp變量只是一個(gè)局部變量,而且還是集合中元素的一個(gè)副本,并不是元素本身。
我自己也試了一下,是有一個(gè)副本的代碼如下:

反編譯代碼如下:

以上這篇淺談foreach寫(xiě)失效的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文搞懂spring boot本地事務(wù)@Transactional參數(shù)
java Struts2框架下實(shí)現(xiàn)文件上傳功能
SpringBoot整合Mybatis實(shí)現(xiàn)多數(shù)據(jù)源配置與跨數(shù)據(jù)源事務(wù)實(shí)例
Spring Boot Maven Plugin打包異常解決方案
Java設(shè)置Excel數(shù)據(jù)驗(yàn)證的示例代碼
淺談SpringSecurity重寫(xiě)默認(rèn)配置
Java設(shè)計(jì)模式編程中的責(zé)任鏈模式使用示例

