【问题标题】:Array of objects in Memory内存中的对象数组
【发布时间】:2015-06-17 08:20:21
【问题描述】:

我有几个关于数组的基本问题。

  1. 假设我声明了一个整数数组

    int intArray[] = new intArray[10];
    intArray[0] = 10;
    intArray[1] = 20;
    // and so on...
    

intArray 是如何存储在内存中的(我指的是数组的元素)?

  1. 假设我声明了一个某种类型的对象数组,比如Employee

    class Employee {
        int x = 10; 
        int y = 20; 
    
        Employee(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
    
    class TestEmployee {
        public void main(String args[]) {
            Employee empArray = new Employee[10];
            empArray[0] = new Employee(10, 20);
            empArray[1] = new Employee(30, 40);
            ...
        }
    }
    

empArray 在内存中是什么样子的?

【问题讨论】:

  • Java 不是一种很好的编程语言,它不能准确地知道堆上发生了什么。实际上,它尽最大努力将这种责任从程序员身上移开。 Java 代表您管理内存,例如垃圾收集、堆分配等。如果你想了解“更接近金属”会发生什么,我建议你使用 C 或 C++。

标签: java arrays heap-memory


【解决方案1】:

考虑以下图片。第一张图显示了原始类型数组(byte、short、int、long、float、double、char、boolean)是如何存储在内存中的。

数组本身是一个对象,使用 new 关键字实例化,并在堆中分配了一些内存。但是 s因为它是一个原始类型数组,它直接存储与其大小一样多的原始值。这些值设置为 0(在 int 原始类型数组的情况下),除非我们使用诸如 intArray[0] = 10; 之类的指令明确更改它们

然而,在引用类型数组的情况下,有一个有趣的区别。 数组本身在使用 new 关键字实例化后在堆上分配了一些内存空间。但它不直接存储对象,而是存储对它所持有的对象的引用。这些引用将是 null 或对内存中某处相应对象的引用(或地址)。对每个对象的引用默认值为 null,除非使用类似于empArray[0] = new Employee(10, 20); 的指令更改它

关于您的后续问题,在一个链接列表中,假设我试图找到一个位于的对象,比如说从列表头部开始的第 11 个位置,我将不得不迭代 10 次才能找到它。因此,链表中元素的大小和位置将影响检索元素所需的时间。然而,在一个数组中,我只需要知道索引,它就会在恒定时间内找到元素。

【讨论】:

    【解决方案2】:
    1. int 的数组:将有一块内存是int 大小的 10 倍,其中存储了值。

    2. Employee 的数组:将有一块内存是对象引用大小的 10 倍,每个元素将引用内存中其他位置的 Employee 对象(或它将是null)。

    【讨论】:

    • 感谢您的回复,
    • 我有一个后续问题。考虑到 empArray 将引用在内存中某个位置创建的 emp 对象。为了从数组中检索对象,假设 empArray[1] 将分两步完成。 1. 检查 empArray[1] 位置中存在的引用地址
    • 我有一个后续问题。如果我错了,请纠正我。考虑到 empArray 将引用在内存中某个位置创建的 emp 对象。为了从数组中检索对象,假设 empArray[1] 将分两步完成。 1. 检查 empArray[1] 位置中的引用地址。 2.去地址,拿到实物。它与链表有何不同?我觉得数组和链表,元素检索是一样的,我们如何告诉数组中的对象检索很快?
    • 链表的组织方式与数组不同。在链表中,每个元素都包含对下一个元素的引用。为了在链表中找到第 N 个元素,您必须遵循从第一个,到第二个,第三个,......直到到达元素 N 的所有链接。在数组中,您可以直接获取元素编号 N,因为您知道元素编号 N 位于数组开头的位置 N * 元素的大小。
    猜你喜欢
    • 2020-06-02
    • 2012-08-15
    • 2011-03-08
    • 2013-12-04
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多