JDK1.5加入泛型以后,传统的for语法也有了新变化。至于详细的区别倒还真没仔细研究,最进和人无意中提到这个问题,哑巴了。
上网搜搜了似乎没有详细的解释,于是好好分析了下,传统for和泛型for的都不陌生,写法如下:
public static void indexFor(int[] ixs) {
for (int i = 0; i < ixs.length; i++) {
ixs[i] = 3;
}
}
public static void genericFor(int[] ixs) {
for (int i : ixs) {
i = 5;
}
}
然后看字节码,先看看传统for语法的字节码:
public static void indexFor(int[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: aload_0
4: arraylength
5: if_icmpge 18
8: aload_0
9: iload_1
10: iconst_3
11: iastore
12: iinc 1, 1
15: goto 2
18: return
从第10和11步的指令可以看出,旧的写法是直接操作修改数组的元素的。
下面看看泛型for语法的字节码:
public static void genericFor(int[]);
Code:
0: aload_0
1: astore_1
2: aload_1
3: arraylength
4: istore_2
5: iconst_0
6: istore_3
7: iload_3
8: iload_2
9: if_icmpge 26
12: aload_1
13: iload_3
14: iaload
15: istore 4
17: iconst_5
18: istore 4
20: iinc 3, 1
23: goto 7
26: return
从第15,17,18步的指令可以看出,泛型for语法代码修改的只是局部变量表中的属性。 不涉及原数组,所以对于java基本类型和String类型来说,想直接修改数组元素是不行的。
如果懒得看字节码,那么只需要将indexFor方法修改如下:
public static void indexFor(int[] ixs) {
int[] iii = ixs;
int x = iii.length;
for (int i = 0; i < x; i++) {
int ne = ixs[i];
ne = 5;
}
此时,indexFor方法编译出的字节码和genericFor方法的字节码就一模一样了,即对于编译器来说,用传统for语法这么写和用泛型for语法是一样的。
这样应该好理解了。
分享到:
相关推荐
C# 学习记录,C#基础语法学习案例37套源码(适合正在学C#的学者) 001第一个HelloWorld程序 002CSharp数据类型与变量 003类型推断 004各种数据类型大小比对及所占字节 005枚举 006结构体 007元组 008字符串 009...
在本章中我们将来学习 Python 的基础语法,让你快速学会 Python 编程。 第一个 Python 程序 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码。 linux上你只需要在命令行中...
文章目录★ 语法格式分为两类:1、语法格式 1 的介绍:1.1、语法格式 1 的工作原理:1.2、语法格式 1 的取值列表:①、字符串:②、范围集合:③、文件名:④、命令执行结果:... 此链接通往 Bash Shell 编程学习的目
Python语法总结,语法学习讲义和笔记。 部分目录: 1. Python 3 1.1. 数据类型: 3 1.1.1. 整数,浮点数,字符串,布尔值(True、False),空值(None) 3 1.1.2. 数据类型list——数组: 3 1.1.3. tuple——常值...
通过hanlp和nltk的CRF语法解析算法进行语法树构建,并使用for循环进行遍历树,然后分词合并成短语,然后标记 # cfg.py 通过hanlp和nltk的CRF语法解析算法进行语法树构建 ``` /home/kuo/anaconda2/envs/py3/bin/...
JavaScript学习资料JavaScript基础语法函数及相关源代码资料: BOM基础.pdf BOM基础(源代码).zip Date对象之获取和设置月份-getMonth&setMonth(教辅).pdf DOM事件总结(教辅).pdf DOM事件(ppt).pdf JavaScripr...
此文档主要讲解C#基础语法,入门基础,可供刚入门的朋友学习参考, 1. 了解.NET平台,C# 2. 顺序结构 1. 控制台基本输入、输出、转义符 2. 基本的数据类型、变量、推断类型var 3. 控制结构 1. 选择结构 -...
python 零基础学习篇
python 零基础学习篇
bat脚本的基本命令语法,学习bat语言很好的资料,word版 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件...
python 零基础学习篇
python 零基础学习篇
The easiest way for the majority of users to install pandas is to install it as part of the Anaconda distribution, a cross platform distribution for data analysis and scientific computing. This is the...
Freemarker页面语法 A 概念 最常用的 3 个概念 sequence 序列,对应java 里的list 、数组等非键值对的集合 hash 键值对的集合 namespace 对一个ftl 文件的引用, 利用这个名字可以访问到该ftl 文件的资源 ...
英文版,sql学习资料,真的很不错 The book covers the latest version of the SQL standard, SQL-99, and includes two complete case studies, showing how to create and query the underlying database for a ...
供学习java xml参考
程序流程控制语句语法知识点循环结构1. for end代码实现:2. while end代码实现条件转移结构 if else end语法:代码实现开关结构表达式语法: switch case end代码实现试探结构:try catch end **这个语法不常用,...
Masm for windows 集成实验环境是针对汇编语言初学者的特点开发的一个简单易用的汇编语言学习与实验软件,支持32位与4位的WINDOWS 7,支持DOS的16/32位汇编程序和Windows下的32汇编程序(并提供调试通过的35个...
Masm for windows 集成实验环境是从事一线教学的大学教师针对汇编语言初学者的特点开发的一个简单易用的汇编语言学习与实验软件,支持32位与4位的WINDOWS 7,支持DOS的16/32位汇编程序和Windows下的32汇编程序(并...
大家学习LINGO的宝典,我记得我看了两个小时就会用LINGO里面的@for以及@sum语句了,清楚明了!