Java 如何在数组中分配对象?

Java 如何在数组中分配对象?,java,Java,我想提高我对编程语言(特别是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 refe

我想提高我对编程语言(特别是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?
现在问题是:

// 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缓存中以这种方式缓存数组呢?

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

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

数组存储对对象的引用,而不是对象本身。因此,在分配

SOARAY[0]
时,可以在位置
0
处交换引用。自身的对象可以在堆中移动,但这通常是由于GC,而不是分配


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

,我们将SO1指向的对象指定给数组元素。

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


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

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


在Java中,数组存储对对象的引用。在C++语句中,它们存储指向对象的指针。
SimpleObject[] soArray = new SimpleObject[10];   //Java
SimpleObject* cppArray[10];                       // C++ equivalent
soArray[0]=so1
soArray[0]
中放置对
so1
的引用,其方式与
cppArray[0]=&so1
存储指向
so1
的指针的方式相同。原始对象保持不变,不会分配或释放额外内存

<>在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]

在Java中,数组存储对对象的引用。在C++语句中,它们存储指向对象的指针。
SimpleObject[] soArray = new SimpleObject[10];   //Java
SimpleObject* cppArray[10];                       // C++ equivalent
soArray[0]=so1
soArray[0]
中放置对
so1
的引用,其方式与
cppArray[0]=&so1
存储指向
so1
的指针的方式相同。原始对象保持不变,不会分配或释放额外内存

<>在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]

对象数组仅存储对对象的引用。它不在数组中存储整个对象。对象数组只存储对对象的引用。它不会将整个对象存储在数组中。回答得很好,谢谢。但是CPU缓存中的缓存阵列呢?只有GC一个接一个地移动对象,这才有可能?如果是这样,没有垃圾收集的语言就不能为CPU执行数组缓存吗?@ArtemZinnatullin老实说,我不知道。据我所知,虽然内存缓存是基于页面的,但对象“只是”需要在内存中彼此靠近。如果将它们放在第一位,也可以在不进行垃圾收集的情况下实现这一点(确保存储到位,请参见Steve的答案)。同样,我对评论和编辑很满意,因为我不确定这里的细节。回答很好,谢谢。但是CPU缓存中的缓存阵列呢?只有GC一个接一个地移动对象,这才有可能?如果是这样,没有垃圾收集的语言就不能为CPU执行数组缓存吗?@ArtemZinnatullin老实说,我不知道。据我所知,虽然内存缓存是基于页面的,但对象“只是”需要在内存中彼此靠近。如果将它们放在第一位,也可以在不进行垃圾收集的情况下实现这一点(确保存储到位,请参见Steve的答案)。同样,我对评论和编辑很满意,因为我不确定这里的细节。