数组如何在Java内部工作?

时间:2014-09-26 23:28:39

标签: java arrays object runtime new-operator

发布此查询基本上了解像

这样的点
  • 对象是类实例或数组;

  • 数组是Object class;

  • 的子类
  • 除了原语之外的所有实例化都是Java中的对象。

以下是我在Java中使用数组的理解。

考虑以下计划,

/* dummy.java */
class C {
    private int i; 
    public C() {
        i = 1;
        System.out.println("Am in constructor");
    }
}
public class dummy {
    public static void main(String[] args) {
        C[] c = new C[2]; // Line 11
        c[0] = new C();
        System.out.println(c);
    }
}

运行后在运行时创建class [LC类型的对象,

C[] c = new C[2]; //Line 11

在上面的代码中。 class [LCObject类的直接子类。在上面的代码中运行c后,引用变量Line 12指向此对象(在下面的红色边界中显示)。引用变量位于堆栈中,类型为class C的对象将进入堆中。

enter image description here

以上代码中line 11 & 12的以下更改

C[][] c = new C[2][2];
c[0][0] = new C();

将表示如下所示。

enter image description here

我的理解是否正确?如果是,您能否详细解释运行时class [LC在实例化对象时的使用情况?

注意:C[].class给出了运行时的实际类型,即class [LC

1 个答案:

答案 0 :(得分:1)

回答你的问题:是的,在Java(和C#)中,几乎所有内容都被分成多个由指针访问的离散内存块。这不仅包括您的二维数组,还包括对象内的任何嵌入对象。在C ++中,如果您有一个包含10个对象的数组(单维或不包含),并且每个对象包含10个嵌入对象,则可以使用一块记忆。在C#和Java中,对于存储所有这些(如果所有嵌入对象都是简单对象),在单维数组的情况下,您将至少有101个内存分配,而在多维数组的情况下则更多。

但是,这些内存的爆炸不应该被看作是一件非常糟糕的事情,因为它可以让你免于管理自己的内存分配,就像你可以使用C / C ++一样在大多数情况下,任何现代CPU的功能通常足以以足够的速度向前推进。