【问题标题】:Memory Allocation for Object Arrays [duplicate]对象数组的内存分配
【发布时间】:2013-12-04 16:07:20
【问题描述】:

在我的计算机科学课程中,我们被告知当你创建一个数组时,JVM 会根据数组的大小自动分配内存。例如,如果您创建一个大小为 10 的整数数组,JVM 会为该数组分配 10 * 32 位的数据。

我的问题是,当您创建具有不同大小的对象数组时,这个过程究竟是如何工作的?例如一个字符串对象。当你创建一个包含 10 个字符串的数组时,系统上是否真的为这些字符串保留了内存,或者因为它们只是指针,所以不需要内存分配?

【问题讨论】:

  • 您实际上构建了一个指针数组,这是正确的。所以你需要 sizeof(pointer) * array_size。将要链接到数组索引的对象实例化需要注意对象的实际内存分配。
  • 这个问题几乎可以回答你的问题stackoverflow.com/questions/5564423/…
  • 实际上,在 Java 中,只有一种类型的对象具有可变大小:数组。其他所有内容都有预先确定的大小(String 在内部保存一个数组)。

标签: java arrays memory


【解决方案1】:

数组本身是 Java 中的一个对象,所以它总是在运行时创建。 From Official tutorial:

创建数组的一种方法是使用 new 运算符。下一个 ArrayDemo 程序中的语句分配一个数组 10 个整数元素的内存并将数组分配给 anArray 变量。

//创建一个整数数组

anArray = new int[10];

如果这样 缺少语句,然后编译器会打印一个错误,例如 以下,编译失败:

ArrayDemo.java:4: 变量 anArray 可能尚未初始化。

还有另一个answer in StackOverflow

【讨论】:

    【解决方案2】:

    int[] => 整数数组

    String [] => 指向字符串实例的指针数组

    int[][] => 指向(单独的,不同的)int[] 数组的指针数组

    【讨论】:

      【解决方案3】:

      由于String 是扩展Object 类的类,并且Java 中的对象通过引用传递(并存储在变量中),因此字符串数组是对String 对象的引用数组。所以,当你这样做时

      String[] a = new String[10];
      

      您正在创建一个引用数组,其中每个引用(不是它指向的对象)的大小都是已知的(32 位机器为 32 位,64 位机器为 64 位)。

      更新:正如 Jon Skeet 所说的in one of his answers,实际引用的大小可能与本机指针大小相同,但不能保证。

      【讨论】:

        猜你喜欢
        • 2020-06-02
        • 2012-05-04
        • 2021-07-24
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        • 2017-11-08
        • 2013-01-21
        相关资源
        最近更新 更多