Java 如何在数组中分配对象?
我想提高我对编程语言(特别是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
// 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的答案)。同样,我对评论和编辑很满意,因为我不确定这里的细节。