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异常处理总结
异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做相同处理,感觉相当 ......
为什么要使用tomcat,jboos这种服务来运行我们的代码,有何必花怎么多钱买IBm,BEA的服务器。草(愤青的语气),我们再也不跟别人走。
难道我们自己写的东西就不可靠吗?我们开发我们的项目,需求我们最清楚,我们怎么做干嘛还要他们管,SSH是别人踢去来。
从今以后,我自己开发的java企业程序(tmd 无法就是请求/响应模式 ......
将java项目生成exe可执行文件全过程
2009年05月10日 星期日 16:30
一、首先为eclipse安装fatjar插件(如果你的jar项目中需要用到图片、外部程序等文件时要用此插件打包程序才能正常运行)
安装方式有两种:方法1:在线安装(推荐)
步骤:
eclipse菜单栏 help >software updates >Find and install >Search f ......
Class.forName(xxx.xx.xx) 返回的是一个类
首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。
至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。
A a = ......
一个Java窗口带按键检测(跑Java可视小程序时用),沒加修饰,俺自己用滴。
package math;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
/**
* 基本的绘图窗口,回车关闭窗口
*/
@SuppressWarnings("s ......