由java数组想到java内存分配

今天在写了类似如下这样一段代码:
String[][] inputMatrix = new inputMatrix[M][N];
for(int i=0; i<M; i++){
	inputMatrix[i] = br.readline().split(",");
}
觉得不妥,凭直觉改为如下:
String[][] inputMatrix = new inputMatrix[M][];
for(int i=0; i<M; i++){
	inputMatrix[i] = br.readline().split(",");
}

仔细思考,我有两个疑问:
1、java数组的内存管理方式
   我发现所有的java数组均可以做为左值,这跟c、c++数组有很大的不一样. 比如c++中是不允许这样的:
   int a[3][3];
   int b[3];
   a[1] = b;//这个是不允许的
2、如何查看java中对象的内存占用情况
   想查看以下java是如何分配内存的,但是没有发现java有相应的函数供使用

google之后关于这两个问题的解答:
1、java数组的内存并不是连续分配的,把二维数组看成数组的数组,也就是一个一维数组,每个数组的元素为一个一维数组的对象。
关于此的一个有趣的问题为:
short[] m = new short[20];
short[][] m = new short[2][10];
这两种声明方式,都是声明一个能够装下20个short元素的容器,哪个所占用的空间更大?
问题的答案为第二个,因为其创建了三个对象(m, m[0], m[1]),而第一个只创建了一个对象(m)。
(参见该例子的原始出处)

2、由于java屏蔽了内存的操作,所以是没有办法来具体获知某些对象所占用的内存空间。但是可以通过Runtime的一些关于heap的信息,来近似地估计
对象所占用的内存大小。
文章Java Tip 130: Do you know your data size?中详细阐述了如何使用该方法。

此处提供一个测试上面两点的例子,点击下载。

Java虽然易学,但是在工程中要能真正写出好的程序,需要功底的。C++的话,程序的处理或许复杂一些,但是编写者对程序运行的理解也会更深刻一些,
优秀的C++程序员能够通过其写出比Java更高效地程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值