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:
相关文档:
/**
*
*/
package com.dongyun.peas2.system.web.action;
///**
// * @author Administrator
// *
// */
//public class ABcom {
//
// /**
// *
// */
// public ABcom() {
// // TODO Auto-generated constructor stub
// }
//
// /**
//&nb ......
转自:http://blog.csdn.net/babydavic/archive/2007/08/23/1755718.aspx
系统属性
是指与用户程序相关的操作系统配置信息以及软件信息。通常与用户程序相关的属性关键字包括:
●file.separator:文件分隔符,
Windows
环境下为“",
Unix
环境下为&ldquo ......
做了一个很简单的界面程序,也是我第一个界面程序.主要功能就是输入两个数字,计算这两个数字的和,很简单的功能,我却花了很久,对java太不熟悉了,连得到textField1中用户输入的值怎么获得,都不知道,后来baidu才知道,
用 textField1.getText()获得输入的值;,
  ......
本人在接触过程中有两个帖子写的不错,在此整理一下:
1.序列化
:将对象转化成流的过程称为序列化
反序列化
:将流转化成对象的过程称之为反序列化
2.对象序列化(Serializable)是指将对象转换为字节序列的过程,而反序列化则是根据字节序列恢复对象的过程。
上面这两个解释都通俗易懂。
序列化经 ......
什么是socket
长连接与短连接
所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。
短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。
比如ht ......