易截截图软件、单文件、免安装、纯绿色、仅160KB

JVM指令解析JAVA多维数组

群内一位培训老师发出来一个问题:
int[][] a = new int[10][10];
这种多维数组会在栈上生成几个对象?
这个问题新鲜,没人问过.
发出来后 大家都认为有几个元素 就会生成几个对象.
我开始也
这么认为.
于是写个了程序试了下.发现没有那么简单
public static void main(String[] args) {
int[][] a = new int[10][10];
}
根据class生成JVM指令:
public static void main(java.lang.String[]);
Code:
Stack=2, Locals=2, Args_size=1
0: bipush 10
2: bipush 10
4: multianewarray #2, 2; //class "[[I"
8: astore_1
9: return
LineNumberTable:
line 9: 0
line 25: 9
}
javap是不骗人的.明明白白的写着Stack=2,一看这结果,不明不白,再做几个例子看下
public static void main(String[] args) {
int[][][][] a = new int[10][20][30][40];
}
对应JVM源码:
public static void main(java.lang.String[]);
Code:
Stack=4, Locals=2, Args_size=1
0: bipush 10
2: bipush 20
4: bipush 30
6: bipush 40
8: multianewarray #2, 4; //class "[[[[I"
12: astore_1
13: return
LineNumberTable:
line 9: 0
line 25: 13
}
又试了几个 发现 数组有几维,就占用几个栈
再试一下赋值与读值
public static void main(String[] args) {
int[][][][] a = new int[10][20][30][40];
a[9][16][17][18] = 999;
}
对应JVM源码:
public static void main(java.lang.String[]);
Code:
Stack=4, Locals=2, Args_size=1
0: bipush 10
2: bipush 20
4: bipush 30
6: bipush 40 //四个值入操作数栈
8: multianewarray #2, 4; //class "[[[[I"
12: astore_1
13: aload_1 //把刚才new的数组的内存地址入栈顶
14: bipush 9 //将数组的第一维下标9入栈顶
16: aaload //根据栈顶的下标读取当前数组的内存地址
17: bipush 16
19: aaload
20: bipush 17
22: aaload //根据栈顶的下标读取当前数组的内存地址
23: bipush 18 //第四维下标入栈
25: sipush 999 //将要赋的值入栈
28: iastore //将值 设置进当前指向的数组内存地址
29: return
LineNumberTable:
line 9:


相关文档:

请大家指教,有关Java中main方法及参数问题

今天没事干。,拿Java中的main函数来讨教,。。还请诸位指点啊,,
public static void main(String args [])
{
 .....
}
这是大家一般的写法吧,这里我想讨教的主要有以下几点:
1.它的参数问题,那个参数倒底有何用呢,,这是很令人迷惑的,这里自己写了个例子试了一下,但是出现了异常:
 class A
{ ......

java WebService Case

一、Axis安装 1、环境 J2SE SDK 1.3 or 1.4: 我使用 1.4.2 Servlet Container: 我使用的Tomcat 5.0
2、到 http://ws.apache.org/Axis/网站下载Axis安装包
3、解压缩安装包,将Axis_UNZIP_PATH\Axis-version\webapps下的Axis包拷贝到TOMCAT_HOME\webapps\下,以下约定Axis_HOME为该TOMCAT_HOME\webapps\Axis目录
4、启动 ......

java序列化与反序列化

本人在接触过程中有两个帖子写的不错,在此整理一下:
1.序列化
:将对象转化成流的过程称为序列化 
   反序列化
:将流转化成对象的过程称之为反序列化
2.对象序列化(Serializable)是指将对象转换为字节序列的过程,而反序列化则是根据字节序列恢复对象的过程。
上面这两个解释都通俗易懂。
序列化经 ......

java+swing C/s模式的socket编程与长短连接

什么是socket
长连接与短连接
所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。
短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。 
比如ht ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号