java foreach循环为什么不能赋值的讲解

 更新时间:2021年09月27日 08:43:59   作者:魅离儿  
这篇文章主要介绍了java foreach循环为什么不能赋值的讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

foreach循环为什么不能赋值

直接上代码

public class test4 {
    public static void main(String args[]){
        int [] a=new int[3];
        for(int j:a){
            j=55;
        }
    }
}

代码很简单

下面是java编译后的字节码

public class test4 {
  public test4();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: iconst_3          //将int型3推送至栈顶
       1: newarray       int        //创建一个指定原始类型的数组,并将其引用值压入栈顶
       3: astore_1          //将栈顶引用型数值存入第二个本地变量
       4: aload_1           //将第二个引用类型本地变量推送至栈顶
       5: dup               //复制栈顶数值并将复制值压入栈顶
       6: astore        5       //将栈顶引用型数值存入指定本地变量,此处将数组引用放在第六个本地变量里
       8: arraylength           //获得数组的长度值并压入栈顶
       9: istore        4       //将栈顶int型数值存入指定本地变量。
      11: iconst_0          //将int型0推送至栈顶
      12: istore_3          //将栈顶int型数值存入第四个本地变量
      13: goto          27      //跳转到27
      16: aload         5       //将指定的引用类型本地变量推送至栈顶
      18: iload_3           //将第四个int型本地变量推送值栈顶
      19: iaload            //将int型数组指定索引的值推送至栈顶    
      20: istore_2          //将栈顶int型数值存入第三个本地变量
      21: bipush        55      //将单字节的常量值(-127~128)推送至栈顶
      23: istore_2          //将栈顶int型数值存入第三个本地变量
      24: iinc          3, 1        //将指定int型变量增加指定值
      27: iload_3           //将第四个int型本地变量推送至栈顶
      28: iload         4       //将指定的int型本地变量推送至栈顶
      30: if_icmplt     16      //比较栈顶两int型数值的大小,当结果小小于0时跳转
      33: return            //从当前方法返回void
}

我们只需要关注6,16~23行就可以,可以发现这几句代码是将数组引用副本中的值取出放在栈顶,然后从栈顶取出变量放在本地变量3中,然后把55放在栈顶,再把55取出放在本地变量3中,从始至终的操作都是在本地局部变量中的,并没有对原来的数值产生任何影响。

foreach循环赋值问题

foreach ($list as $key=>$val){
    $data=array();//这一个一定要加上不然循环后,modify_one,modify_two都会赋值
    if ($val['id']!=1){
        $link = explode("801",$val['p_link']);
        if (isset($link['1'])){
            if ($val['times']%2==0){
                $data['modify_two']=$ftp->time($link['1']);
            }else{
                $data['modify_one']=$ftp->time($link['1']);
            }
            $admin->edit_modify($val['id'],$data);
            $admin->addTimes($val['id']);
        }
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java异常java.lang.UnsatisfiedLinkError: no opencv_java320 in java.library.path的解决

    Java异常java.lang.UnsatisfiedLinkError: no opencv_ja

    这篇文章主要介绍了Java异常java.lang.UnsatisfiedLinkError: no opencv_java320 in java.library.path的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • SpringCloud GateWay动态路由用法

    SpringCloud GateWay动态路由用法

    网关作为所有项目的入口,不希望重启,因此动态路由是必须的,动态路由主要通过RouteDefinitionRepository接口实现,其默认的实现是InMemoryRouteDefinitionRepository,即在内存中存储路由配置,可基于这个map对象操作,动态路由的实现方案有两种
    2024-10-10
  • spring boot 全局异常处理方法汇总

    spring boot 全局异常处理方法汇总

    这篇文章主要介绍了spring boot 全局异常处理方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java与MySQL时间不一致问题解决

    Java与MySQL时间不一致问题解决

    本文主要介绍了Java与MySQL时间不一致问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Maven deploy配置方法详解

    Maven deploy配置方法详解

    这篇文章主要介绍了Maven deploy配置方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • java算法题解Leetcode763划分字母区间示例

    java算法题解Leetcode763划分字母区间示例

    这篇文章主要为大家介绍了java算法题解Leetcode763划分字母区间示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • idea 2023.1字体设置及自动调整大小的图文教程

    idea 2023.1字体设置及自动调整大小的图文教程

    这篇文章主要介绍了idea 2023.1字体设置及自动调整大小的教程,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • 简单了解Java编程中线程的创建与守护线程

    简单了解Java编程中线程的创建与守护线程

    这篇文章主要介绍了Java编程中线程的创建与守护线程,是Java多线程并发编程的基础,需要的朋友可以参考下
    2015-11-11
  • java把excel内容上传到mysql实例代码

    java把excel内容上传到mysql实例代码

    这篇文章主要介绍了java把excel内容上传到mysql实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 详解Java变量与常量

    详解Java变量与常量

    这篇文章主要介绍了Java变量与常量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论