0

我想提高我对编程语言(尤其是 Java)内存模型的了解,所以我有一个问题。

这是非常简单的代码:

// Allocating memory in heap for SimpleObject's instance
// Creating reference to this object with name so1
SimpleObject so1 = new SimpleObject();


// Allocating memory in heap for array of 10 references to SimpleObject's objects
// Now I know, that array stores only references to the objects
// (Previously I thought that array stores objects)
// Then we create reference to this array with name soArray
SimpleObject[] soArray = new SimpleObject[10];

现在的问题:

// What is going on here?
soArray[0] = so1;
// object so1 had been really moved to memory area of soArray?
// And so1 reference have been updated to new memory address?

// Or we just had assigned so1 object's reference to soArray[0] element?

// Or so1 object had been copied to the soArray[0]? 
// Then original so1 object has been deleted and all links to it had been updated?

如果您知道它在其他语言中的工作原理,例如(C、C++、C# 或其他),请回答,我会很高兴知道。

大家都知道,ArrayList 可以比 LinkedList 快,因为数组的元素可以存储在 CPU 缓存中,而如果我们使用 LinkedList,CPU 每次都必须从 RAM 中获取下一个对象。

那么,如果一开始我在堆中创建了对象,然后才将对象放入数组中,它怎么能工作呢?

UPD:谢谢你们,现在我了解了数组是如何工作的,但是以这种方式在 CPU 缓存中缓存数组呢?

4

3 回答 3

4

数组存储对对象的引用,而不是对象本身。0因此,您在分配时交换位置的参考soArray[0]。自己的对象可以在堆内移动,但这通常是由于 GC,而不是分配。

如果对象本身直接存储在数组中,则您的数组中不能有具有更多实例字段的子类实例。它们不适合分配的空间,因此只能成为基类的实例。当您分配存储在堆栈上的类实例时,这就是 C++ 中实际发生的情况。

于 2013-05-18T21:29:08.363 回答
2

在 Java 中,数组存储对对象的引用。在 C++ 中,它们存储指向对象的指针。

SimpleObject[] soArray = new SimpleObject[10];   //Java
SimpleObject* cppArray[10];                       // C++ equivalent

soArray[0] = so1;以与存储指向的指针相同的方式对so1in进行引用。原始对象保持不变,没有分配或释放额外的内存。soArray[0]cppArray[0] = &so1so1

在 C++ 中,您可以将对象直接存储在数组中。

SimpleObject soArray[10];                       // An array that stores Simple Objects in place
SimpleObject so1;                               // A new object
soArray[0] = so1;                               // This *copies* so1 into soArray[0]
于 2013-05-18T21:44:03.570 回答
-1

我们将对 so1 指向的对象的引用分配给数组元素。

这是一个使用 Python Tutor 的示例(据我所知,Java 没有等效的工具,但内存模型是相似的,除了 Class 是一个对象,所以忽略它):

Python 中的示例

于 2013-05-18T21:31:15.443 回答