易截截图软件、单文件、免安装、纯绿色、仅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路径问题最终解决方案

前言
      Java的路径问题,非常难搞。最近的工作涉及到创建和读取文件的工作,这里我就给大家彻底得解决Java路径问题。
      我编写了一个方法,比 ClassLoader.getResource(String 相对路径)方法的能力更强。它可以接受“../”这样的参数,允许我们用相 ......

java读文件 乱码

/**
 *
 */
package com.dongyun.peas2.system.web.action;
///**
// * @author Administrator
// *
// */
//public class ABcom {
//
// /**
//  *
//  */
// public ABcom() {
//  // TODO Auto-generated constructor stub
// }
//
// /**
//&nb ......

Java算法 直接插入排序

/**
     * 直接插入排序,首先比较a[n]与a[n-1],在比较a[n]与a[n-2]
     * */
    public void sort0(double[] a){
        for(int i = 0; i < a.length -1; i ++){
           ......

java下Class.forName的作用是什么,为什么要使用它

Class.forName(xxx.xx.xx) 返回的是一个类
首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。
至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。
A a = ......

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

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