浅谈foreach写失效的问题

 更新时间:2017年07月31日 08:52:31   投稿:jingxian  
下面小编就为大家带来一篇浅谈foreach写失效的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Java中的细节一定要清楚,否则非常容易出现问题。例如这个场景:遍历一个集合,对符合某种条件的元素做修改。大家往往会写出如下代码:

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遍历对集合元素进行修改。在以为变更已发生的时候,其实变更没有发生。造成数据写入失败。因为

for (Integer temp : list)
{
 if (temp == 1)
 {
  temp = temp * 2;
 }
}

根据oracle的官方文档,正式翻译应该如下

for (Iterator i = list.iterator(); i.hasNext(); )
{
 float i0 = (Integer)i.next();
  if(i0 == 1)
   i0 = i0*2;
}

即:foreach里头的的 temp变量只是一个局部变量,而且还是集合中元素的一个副本,并不是元素本身。

我自己也试了一下,是有一个副本的代码如下:

反编译代码如下:

以上这篇浅谈foreach写失效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JAVA多线程抢红包的实现示例

    JAVA多线程抢红包的实现示例

    这篇文章主要介绍了JAVA多线程抢红包的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • jdk-logging log4j logback日志系统实现机制原理介绍

    jdk-logging log4j logback日志系统实现机制原理介绍

    这篇文章主要介绍了jdk-logging、log4j、logback日志介绍以及三个日志系统的实现机制,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • SpringBoot实现在webapp下直接访问html,jsp

    SpringBoot实现在webapp下直接访问html,jsp

    这篇文章主要介绍了SpringBoot实现在webapp下直接访问html,jsp问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • servlet实现文件下载的步骤及说明详解

    servlet实现文件下载的步骤及说明详解

    这篇文章主要为大家详细介绍了servlet实现文件下载的步骤及说明,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 汇总java调用python方法

    汇总java调用python方法

    这篇文章主要为大家详细介绍了java调用python的方法,文章中介绍了三种java调用python方法,感兴趣的朋友可以参考一下
    2016-02-02
  • Java 详细分析四个经典链表面试题

    Java 详细分析四个经典链表面试题

    兄弟们,编程,当我们学习完数据结构的时候,你就会有一种豁然开朗的感觉。算是真正的入了编程的门,所以打好数据结构的基础是特别特别重要的
    2022-03-03
  • Servlet注解之@WebInitParam多个InitParam的使用

    Servlet注解之@WebInitParam多个InitParam的使用

    这篇文章主要介绍了Servlet注解之@WebInitParam多个InitParam的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java Timezone类常见问题_动力节点Java学院整理

    Java Timezone类常见问题_动力节点Java学院整理

    这篇文章主要介绍了Java Timezone类常见问题的相关资料,需要的朋友可以参考下
    2017-05-05
  • java的Map集合中按value值进行排序输出的实例代码

    java的Map集合中按value值进行排序输出的实例代码

    下面小编就为大家带来一篇java的Map集合中按value值进行排序输出的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • 详解springSecurity之java配置篇

    详解springSecurity之java配置篇

    这篇文章主要介绍了详解springSecurity之java配置篇,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论