【问题标题】:How array works internally in Java?数组如何在 Java 内部工作?
【发布时间】:2014-11-22 01:31:38
【问题描述】:

发这个查询是为了基本了解点喜欢

  • 对象是类实例或数组;

  • 数组是Object类的子类;

  • 在 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 [LC 是 Object 类的直接子类。在上述代码中运行Line 12 后,引用变量c 指向该对象(如下图红色边界所示)。引用变量位于堆栈中,class C 类型的对象将进入堆中。

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

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

如下图所示。

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

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

【问题讨论】:

  • 几乎正确。但是, C 的实例不是数组的一部分(与您的红色边界所暗示的相反)。
  • 您希望从中学到什么?你为什么想知道。这可以帮助别人为您提供更好的答案。
  • 还有一些细节是数组的内存将保存数组的大小、类型,并且可能不连续。
  • @OliverCharlesworth 当您说 C 的实例不是数组的一部分时,我没有听懂您的意思。 C 的实例位于堆中,与引用变量不同,对吗?
  • 数组和 C 实例都是对象,所以它们都在堆上(至少在概念上)。但它们是独立的对象。

标签: java arrays object runtime new-operator


【解决方案1】:

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

但是,这种内存块的爆炸不应被视为非常糟糕的事情,因为它使您摆脱了管理自己内存分配的困难,就像使用 C/C++ 一样,并且在大多数情况下,任何现代 CPU 通常都足以将其以足够的速度向前推进。

【讨论】:

  • class [LC 是否实现了任何接口?如果是,请告诉我该接口的名称或定义
  • 据我所知。您不能创建将在本机模拟数组的对象。
  • 当我们说引用变量c在执行C[] c = new C[2]之后指向class [LC的一个实例。 class [LC的构造函数是否被调用实例化?
  • 在内部,对象 c 的内存由运行时初始化为正确的值。但是,您无权访问此行为:您不能直接调用它或从您的 Java 编码中更改它。因此,您是否将此初始化称为构造函数或其他任何名称,这取决于您。我记得,C++ 允许你访问这个过程的某些部分,但 Java 没有。
  • [LC; 类是Object 的子类,继承了Object API 中的所有方法。然而,很明显,Object 是一个类而不是一个接口。但是,[LC; 类仅存在于概念意义上。它没有代码,没有自己的方法,也不能像普通类一样被实例化,无论是Java源代码、字节码还是反射。
猜你喜欢
  • 1970-01-01
  • 2015-12-24
  • 2013-10-22
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
相关资源
最近更新 更多