由java数组想到java内存分配

来源:互联网 发布:网络直播的危害 编辑:程序博客网 时间:2024/04/27 17:33

今天在写了类似如下这样一段代码: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更高效地程序。