Gen对于数组Array的处理
举个例子,如下:
public void t() {
String[][] a = new String[][] {
{ "x", "y" }
};
String[] b = new String[10];
String[] c = new String[] { "x", "y" };
String[] d = { "x", "y" };
}
其中a如下语句生成的class内容一样,如下:
String[][] a2 = { { "x", "y" } };
当在创建时初始化数组时,不能指定数组的大小,如下会报错:
String[] c = new String[2] { "x", "y" };
String[][] a1 = new String[2][] { { "x", "y" } };
Eclipse编译器报错:Cannot define dimension expressions when an array initializer is provided
则生成的class内容如下:
public void t();
flags: ACC_PUBLIC
Code:
stack=7, locals=5, args_size=1
// 创建第一个数组
0: iconst_1 // 创建的一维数组的长度,这是因为初始化模块中只有一个元素,即{"x","y"}
1: anewarray #2 // class "[Ljava/lang/String;"
4: dup
5: iconst_0 // 表示二维数组的第0个索引上要放入一维数组值
6: iconst_2 // 由于一维数组{"x","y"}的长度为2,所以加载常量2
7: anewarray #3 // class java/lang/String
10: dup
11: iconst_0 // 在一维数组索引0的位置存储x
12: ldc #4 // String x
14: aastore
15: dup
16: iconst_1 // 在一维数组索引1的位置存储y
17: ldc #5 // String y
19: aastore
20: aastore
21: astore_1
// 创建第二个数组
22: bipush 10
24: anewarray #3 // class java/lang/String
27: astore_2
// 创建第三个数组
28: iconst_2
29: anewarray #3 // class java/lang/String
32: dup
33: iconst_0
34: ldc #4 // String x
36: aastore
37: dup
38: iconst_1
39: ldc #5 // String y
41: aastore
42: astore_3
// 创建第四个数组
43: iconst_2
44: anewarray #3 // class java/lang/String
47: dup
48: iconst_0
49: ldc #4 // String x
51: aastore
52: dup
53: iconst_1
54: ldc #5 // String y
56: aastore
57: astore 4
59: return
首先来详细分析第一个数组的创建过程:
0: iconst_1 1: anewarray #2 // class "[Ljava/lang/String;" 4: dup 5: iconst_0 6: iconst_2 7: anewarray #3 // class java/lang/String 10: dup 11: iconst_0 12: ldc #4 // String x 14: aastore 15: dup 16: iconst_1 17: ldc #5 // String y 19: aastore 20: aastore 21: astore_1
第一个数组的树形结构如下:

具体执行过程如下:
0: iconst_1
调用ImmediateItem(1)的load方法将常数加载到操作栈中
1: anewarray #2 // class "[Ljava/lang/String;"
将一维数组类型存入到常量池中,直接向操作栈中压入这个数组类型String[]
4: dup
生成一个StackItem(Object)并调用其duplicate()方法
5: iconst_0
调用ImmediateItem(0)的load方法将常数加载到操作栈中
6: iconst_2
调用ImmediateItem(2)的load方法将常数加载到操作栈中
7: anewarray #3 // class java/lang/String
将String类型存入到常量池中,直接向操作栈中压入这个类型String
10: dup
生成一个StackItem(Object)并调用其duplicate()方法
11: iconst_0
调用ImmediateItem(0)的load方法将常数加载到操作栈中
12: ldc #4 // String x
调用ImmediateItem("x")的load方法将常数加载到操作栈中
14: aastore
创建并调用IndexedItem(object)并调用其store()方法
15: dup
16: iconst_1
17: ldc #5 // String y
19: aastore
20: aastore
为如下的执行代码返回StackItem(object)
21: astore_1
创建并调用IndexedItem(object)并调用其store()方法
Gen对于数组Array的处理的更多相关文章
- Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别
ArrayList和Vector的区别ArrayList与Vector主要从二方面来说. 一.同步性: Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步 ...
- go 数组(array)、切片(slice)、map、结构体(struct)
一 数组(array) go语言中的数组是固定长度的.使用前必须指定数组长度. go语言中数组是值类型.如果将数组赋值给另一个数组或者方法中参数使用都是复制一份,方法中使用可以使用指针传递地址. 声明 ...
- javascript类型系统——数组array
× 目录 [1]创建 [2]本质 [3]稀疏[4]长度[5]遍历[6]类数组 前面的话 除了对象之外,数组Array类型可能是javascript中最常用的类型了.而且,javascript中的数组与 ...
- swift基本用法-数组array
数组简单用法 //------------------------------------------------------------------------------ // 1. 数组定义 / ...
- C#中数组Array、ArrayList、泛型List<T>的比较
在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序 ...
- Javascript基础系列之(四)数据类型 (数组 array)
字符串,数值,布尔值都属于离散值(scalar),如果某个变量是离散的,那么任何时候它只有一个值. 如果想使用变量存储一组值,就需要使用数组(array). 数组是由多个名称相同的树值构成的集合,集合 ...
- AS3 - 数组Array的几个常用方法(附样例)
AS3 - 数组Array的几个常用方法(附样例) 2015-03-30 10:39发布:hangge浏览:241 Flex/Flash开发中,经常会使用到数组,下面总结了一些数组的常用方法. 1 ...
- Linux数组array基础
Linux数组array基础[${a[*]}和$a的区别] Bash中,数组变量的赋值有两种方法: (1) name = (value1 ... valuen) 此时下标从0开始 (2) name[i ...
- 学习Swift -- 数组(Array) - 持续更新
集合类型--数组 Array是Swift中的一种集合类型:数组,数组是使用有序列表储存同一类型的多个值,与OC的NSArray的最大不同是,Swift的数组是值类型,OC的数组是引用类型 声明数组的方 ...
随机推荐
- (转)使用 vs.php 调试PHP
转自:http://www.jb51.net/article/24618.htm 早先在asp横行的年代,php和asp一样,大都都是html中夹杂代码,说实话,这时候IDE的确用处不是很大,倒是 ...
- (day20)javaEE三大组件之一Servlet (简介(二)servletconfig,servletContext,session,cookie,request,response,out)
javaEE是服务器编程,javaEE提供了服务器的接口让具体的服务器去创建实现的对象 JavaEE是sun公司为了解决企业级开发定义的一套技术,只提供了规范,具体的实现是由服务器完成的 servle ...
- java基础-day33
第10天 Transaction事务 今日内容介绍 u 事务管理 u 转账案例 u 事务总结 第1章 事务管理 1.1 事务概述 l 事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都 ...
- SPFA_queue_链式前向星最短路 & HDU2433
题目大意:看完之后,觉得不肯能让我暴力,比较好想的就是初始化——每个点都求个最短路spfa,sum数组记录每个点到各个点的最短路之和,ans作为总和,之后一一删除边u-v,求关于u的最短路,如果dis ...
- java基础知识-二进制
1.二进制<0B>出现的原因 2. 八进制<0>和十六进制<0X>出现的原因:简化书写和记忆 3.十进制到其他进制的转换方法 method:除以进制数,直到商为0, ...
- Android记录10--android.os.NetworkOnMainThreadException异常解决办法
2013年11月1日小光棍节 有一段时间没有发表新的博客了,最近一直在忙着开发新浪微博客户端遇到很多问题比较头痛,比如说本篇博客要讲的NetworkOnMainThreadException这个异常, ...
- ASP.NET Web API 框架研究 Controller创建 HttpController介绍
对请求进行路由解析以及消息处理管道进行处理后,最后可以从HttpRequestMessage对象的属性字典中获取解析的路由数据,后边我们就可以根据其进行HttpController的创建,从前边几篇可 ...
- 加密算法比较3DES AES RSA ECC MD5 SHA1等
加 密算法通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了.非对称算法与之不同,发送双方A,B事先均 ...
- RxSwift学习笔记6:Subjects/PublishSubject/BehaviorSubject/ReplaySubject/Variable
// 从前面的几篇文章可以发现,当我们创建一个 Observable 的时候就要预先将要发出的数据都准备好,等到有人订阅它时再将数据通过 Event 发出去. // 但有时我们希望 Observabl ...
- Delphi获取公网IP地址函数
uses IdHTTP; function GetPublicIP: string; var strIP, URL: string; iStart, iEnd: Integer; MyIdHTTP: ...