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语法是一样的。
这样应该好理解了。
分享到:
相关推荐
《SimTALK 1.0语法学习》是针对机械工程、工业工程以及管理科学与工程领域的高年级本科生和研究生设计的一份重要参考资料。SimTALK是Plant Simulation软件中用于建模和仿真的专用编程语言,它允许用户创建复杂的工业...
这篇"php基本语法学习笔记"将引导我们深入理解PHP的核心概念和基础语法。通过博主杨梦在ITEYE博客上分享的文章链接(https://yangmeng.iteye.com/blog/1969617),我们可以获得关于PHP编程的实用知识。 首先,PHP...
通过上述内容的学习,我们可以了解到`FOR`命令在批处理脚本中的强大功能和灵活性。无论是简单地遍历文件列表还是处理复杂的文本数据,`FOR`循环都能提供强大的支持。掌握了这些基础知识后,我们就能更加自如地应对...
在"C#语法学习—(word版)"这份资料中,我们可以期待深入探讨C#的基础知识,这对于初学者和有经验的开发者来说都是宝贵的资源。 首先,C#语法的核心概念包括变量、数据类型、运算符和控制流。变量是存储数据的容器...
Razor语法学习手册是一份面向初学者的文档,旨在介绍和讲解MVC(Model-View-Controller)架构中Razor视图引擎的基础语法。Razor是*** MVC 3引入的一种新的语法,它简化了C#代码与HTML标记之间的嵌入方式,为开发者...
《C 学习指南 - 语法篇》是一个深入解析C语言语法的重要资源包,适合初学者及有一定基础的程序员进一步巩固C语言基础知识。这个压缩包包含了一份详细的学习指南,主要聚焦于C语言的语法结构,是提升编程技能的宝贵...
C# 学习记录,C#基础语法学习案例37套源码(适合正在学C#的学者) 001第一个HelloWorld程序 002CSharp数据类型与变量 003类型推断 004各种数据类型大小比对及所占字节 005枚举 006结构体 007元组 008字符串 009...
由微软公司推出,它以其强大的功能、简洁的语法和高效性受到开发者们的喜爱。本教程将深入介绍C#的基本语法,帮助你快速上手并提升编程技巧。 一、变量与数据类型 在C#中,变量是用来存储数据的容器,必须先声明其...
这个压缩包"主要用于学习Python语法,机器学习,以及深度学习的仓库.zip"显然是一个资源库,包含了学习这三个主题的资料。 首先,让我们深入了解Python语法。Python的基础包括变量、数据类型(如整型、浮点型、字符...
基础语法包括变量声明、数据类型(如int、string、bool等)、控制流(如if语句、for循环、switch语句)、函数定义与调用等。此外,C#还支持类、接口、抽象类、枚举、委托、事件等面向对象特性。特别地,C# 6及以上...
总结,Delphi编程基础语法的学习包括理解Pascal语言基础、掌握对象和类的使用、熟悉VCL组件库以及事件驱动编程。通过个人学习集锦中的工程实例,可以更深入地了解Delphi在实际工程中的应用,从而提升编程技能。
以下是对“for”在英语六级语法中的五个主要用法的详细解析: 1. **表目的**:介词“for”常用来表示行为的目的。例如,"They went out for a walk." 表示他们出去是为了散步。然而,值得注意的是,通常不使用 "for...
保留字是Delphi语言预先定义并具有特殊含义的词汇,如`if`, `then`, `else`, `for`等,开发者不应使用它们作为自定义标识符。限定符如`const`, `var`, `procedure`等,用于在代码中声明不同的语言元素。 常量是固定...
**C#语法详解** C#(读作"C sharp")是一种面向对象的编程语言,由微软公司开发,主要用于构建Windows...提供的Excel文档《C#语法》可能是按章节详细列出这些概念的一个参考工具,对于学习和复习C#语法非常有帮助。
"Java的基础语法学习"是每个初学者必须掌握的关键步骤,它包括变量、数据类型、运算符、控制结构、方法、类和对象等核心概念。 1. 变量与数据类型:在Java中,变量是存储数据的容器。Java提供了多种数据类型,包括...
1. **C语言语法**:C语言的语法基于B语言,包括变量声明、函数定义、控制结构(如if-else、for、while循环)、运算符优先级、数组、指针等。了解这些基本元素是进行语法分析的基础。 2. **词法分析**:在语法分析...
本教程“C#之语法学习(上)”是为初学者设计的,旨在帮助他们掌握C#的基础语法,以便快速入门并进一步深入学习。通过视频教程的形式,可以更直观地理解和学习编程概念。 以下是C#语法的一些核心知识点: 1. **...
SPSS是一款广泛使用的统计分析软件,其全称为“Statistical Package for the Social Sciences”,即社会科学统计软件包。SPSS软件因其操作简便,功能强大而在学术界和市场中占据重要地位。SPSS编程语法手册是一本...
编译原理实验是计算机科学教育中的重要实践环节,通过这样的实验,学生能深入理解编译器的工作原理,学习如何设计和实现词法分析器和语法分析器。学长的90分答辩成绩表明他对此有深入理解和扎实的实践经验。 总的来...