反编译解析数组为什么可以使用foreach

2023-10-30

一、说明

  • foreach 循环遍历的原理是通过迭代器 Iterator,不断获取 next 元素,所以使用 foreach,编译的时候编译器会自动将对 for 这个关键字的使用转化为对目标的迭代器的使用
  • 我们常常认为,要想使用 foreach 循环遍历,就必须正确地实现 Iterable 接口,但是,你有没有想过,数组没有实现 Iterable 接口,为什么可以使用 foreach 语句循环遍历呢?这里我使用几个例子,以及进行Java反编译来说明数组这个特殊情况

二、集合使用foreach

  • 首先,我们基于对照试验,使用实现 Iterable 接口的 Collection 集合(ArrayList)进行 foreach 使用
import java.util.ArrayList;

/**
 *
 * @author 吕泽江
 * @version 创建日期: 2021-3-15 14:39:11
 */
public class TestCollection {
   
	public static void main(String[] args) {
   
		ArrayList<Integer> arrayList = new ArrayList<>();
		arrayList.add(1);
		arrayList.add(2);
		arrayList.add(3);
		arrayList.add(4);
		arrayList.add(5);
		
		for (Integer integer : arrayList) {
   
			System.out.println(integer);
		}
	}
}

三、数组使用foreach

  • 然后,我们使用没有实现 Iterable 接口的数组来进行 foreach 对比
/**
 *
 * @author 吕泽江
 * @version 创建日期: 2021-3-15 14:42:28
 */
public class TestArray {
   
	public static void main(String[] args) {
   
		int[] arr = {
   6,7,8,9,10};
		for (int i : arr) {
   
			System.out.println(i);
		}
	}
}
  • 以上两个程序十分简单,可以看到输出结果均为预期结果,但是单单这样,我们还不至于探究数组与 foreach 的特殊关系

四、数组使用for

  • 这里举例数组使用 for 的目的在于下述对于Java反编译的对照
/**
 *
 * @author 吕泽江
 * @version 创建日期: 2021-3-15 14:45:42
 */
public class TestFor {
   
	public static void main(String[] args) {
   
		int[] arr = {
   6,7,8,9,10};
		for (int i = 0; i < arr.length; i++) {
   
			System.out.println(arr[i]);
		}
	}
}

五、javap反编译程序

  • 我们使用以下命令来对上述几个程序进行Java反编译处理
javac -encoding utf-8 TestCollection.java
javap -v TestCollection.class
javac -encoding utf-8 TestArray.java
javap -v TestArray.class
javac -encoding utf-8 TestFor.java
javap -v TestFor.class

5.1 TestCollection结果

Classfile /D:/workspace/Test/src/Test0315/TestCollection.class
  Last modified 2021-3-15; size 852 bytes
  MD5 checksum abb0ab7ce240eb4590733fa75e5448a5
  Compiled from "TestCollection.java"
public class Test0315.TestCollection
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #13.#25        // java/lang/Object."<init>":()V
   #2 = Class              #26            // java/util/ArrayList
   #3 = Methodref          #2.#25         // java/util/ArrayList."<init>":()V
   #4 = Methodref          #9.#27         // java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   #5 = Methodref          #2.#28         // java/util/ArrayList.add:(Ljava/lang/Object;)Z
   #6 = Methodref          #2.#29         // java/util/ArrayList.iterator:()Ljava/util/Iterator;
   #7 = InterfaceMethodref #30.#31        // java/util/Iterator.hasNext:()Z
   #8 = InterfaceMethodref #30.#32        // java/util/Iterator.next:()Ljava/lang/Object;
   #9 = Class              #33            // java/lang/Integer
  #10 = Fieldref           #<
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反编译解析数组为什么可以使用foreach 的相关文章

随机推荐

  • com.netflix.discovery.shared.transport.TransportException(问题解决)

    com netflix discovery shared transport TransportException Cannot execute request on any known server com sun jersey api
  • pymysql语句使用变量

    pymysql语句中想要使用变量的方法 1 替代 cursor excute insert into table1 values s value 2 逗号传参 cursor excute insert into table1 values
  • Linux下在非root权限下修改gcc版本(亲测可用)

    一 前言 最近在安装 香港中文大学 商汤科技联合实验室开源的基于 PyTorch 的检测库 mmdetection时候发现gcc版本需要在4 9以上 但是考虑到实验室服务器集群上gcc的版本还是比较旧的 作为一个非root用户又没有操作权限
  • STM32移植到GD32(以32的工程为模板简单三步完成移植)

    STM32移植到GD32 一 移植说明 最近有个项目想用GD替代原有的STM32 因为GD的成本更低 然后我就找了一些GD的资料 发现目前网上已有的一些资料都比较老 比如ST移植到GD的攻略 很多都停留在GD刚推广不久的过渡时期 目前已经不
  • 数据结构之排序:快速排序

    快速排序 Quick Sort 由 C A Hoare 在1962年提出 是冒泡排序的一种改进 采用了分治策略 将原问题划分成若干个规模更小但与原问题相似的子问题 然后递归方法解决 合并问题的解 基本思想 通过一趟排序将序列分割成独立的两个
  • C++ & QT 琐碎知识点

    此文仅记录C 和QT 学习过程中一些琐碎知识点 shadow build 是将源码路径和构建路径分开 主要将makefile和其它生成的文件分开 保证源码文件的清洁 qmke和cmake都有采用 pro user 用于记录打开工程的路径 所
  • SpringCloud Stream消息驱动

    目录 一 SpringCloud Stream概述 二 Binder 三 Consumer Groups 针对消费者 四 Publish Subscribe 介绍一下yml配置的含义 五 消息分组 六 消息分区 1 生产者方配置 2 消费者
  • osgEarth的Rex引擎原理分析(三十五)osgEarth地球椭球体ellipsoid 大地基准面datum 地图投影Projection详解

    目标 二十九 中的问题83 地球椭球体的中心为地心 形状为椭球体 大地基准面是适应某一区域的椭球体 球体中心不一定在地心 地图投影是球面和平面映射关系的方法 Horizontal Datum A datum is a reference p
  • 学Transformer前,你需要了解的Attention机制(基于注意力机制的Seq2seq可视化神经机器翻译模型)

    在我们开始学习transformer之前 应该了先解下什么是attention注意力机制 相关内容获取 欢迎关注公众号 AI技术星球 发送 222 序列到序列 Sequence to sequence 模型已经在机器翻译 文本摘要和图像字幕
  • ubuntu18.04 配置nfs服务

    1 安装nfs服务器软件 sudo apt install nfs kernel server 2 修改配置文件 添加nfs server上用于共享的目录 并设置允许访问该目录的客户机IP 及其读写权限 sudo vim etc expor
  • YOLOV5 和 Yolov5s各个版本的 发展史、论文、各个版本代码资源分享合集 !!!

    点击上方 码农的后花园 选择 星标 公众号 精选文章 第一时间送达 2020年2月份YOLO之父Joseph Redmon宣布退出计算机视觉的研究的时候 很多人都以为目标检测神器YOLO系列就此终结 没想到的是 2020年4月份曾经参与YO
  • 后台获取数据库时间出现的格式问题记录

    问题描述 要从数据库获取时间类型然后传给前台页面 数据库中的时间格式是yyyy MM dd HH mm ss 如图所示 但是获取出来时格式就变成了Mon Dec 13 10 04 16 CST 2021这种 解决 可以在前端或者后端解决 后
  • MYSQL数据库和表

    一 安装MYSQL数据库时生成系统使用的数据库 1 显示数据库 2 创建数据库 3 选择数据库 mysql gt use stusys Database changed 4 修改数据库 mysql gt alter database stu
  • win32应用程序_不是有效的win32应用程序怎么解决

    在日常办公中经常用到电脑 有许多使用技巧 本次给大家介绍不是有效的win32应用程序怎么办 快来看看吧 方法一 不是有效的win32应用程序表示这个应用程序和系统不兼容 用户可以在计算机属性页面查看系统是32位还是64位 之后下载相对应的应
  • 【源码】贝叶斯变化点检测与时间序列分解

    BEAST 突变 季节性和趋势的贝叶斯估计器 是一种快速 通用的贝叶斯模型平均算法 用于将时间序列或1D序列数据分解为单个组件 例如突变 趋势和周期 季节性变化 如Zhao等人 2019 所述 BEAST可用于变化点检测 即断点或结构中断
  • mysql进阶1——proxysql中间件

    文章目录 一 基本了解 二 安装部署 三 proxysql管理配置 3 1 内置库 3 1 1 main库表 3 1 2 stats库表 3 1 3 monitor库 3 2 常用管理变量 3 2 1 添加管理用户 3 2 2 添加普通用户
  • WSL无法访问网络的解决办法

    今天在用WSL的时候突然网络抽风 域名解析出了问题 apt update都用不了 网上查了很多方法 什么vEthernet的IP啊 ifconfigip啊 ip route add default啥的 都不管用 最后还是看了一下 etc r
  • 多益网络提前批前端面试(凉)

    题外话 面试时间是晚上7点多 多益还是加班严重啊 这点哈哈哈哈 下面正文 自我介绍 问项目 问看过的书籍 这里就是挖坑了 尽量找自己会的说 XHR HTTP1和HTTP2的区别 隐藏一个HTML标签 v for 为什么不能用index做ke
  • QT基础部件学习笔记

    目录 一 QT程序开发流程 二 QT基础部件分类 1 按钮类 普通 工具 单选 复选 命令连接 编辑 编辑 2 布局类 水平 垂直 网格 两列 该类的实例具体与其他类同时使用 编辑 3 输出类 标签 文本浏览器 日历 七段数码管 进度条 4
  • 反编译解析数组为什么可以使用foreach

    反编译解析数组为什么可以使用foreach 一 说明 二 集合使用foreach 三 数组使用foreach 四 数组使用for 五 javap反编译程序 5 1 TestCollection结果 5 2 TestArray结果 5 3 T