Java 内存中的对象数组
我有一些关于数组的基本问题Java 内存中的对象数组,java,arrays,heap,Java,Arrays,Heap,我有一些关于数组的基本问题 假设我声明了一个整数数组 int intArray[] = new intArray[10]; intArray[0] = 10; intArray[1] = 20; // and so on... intArray如何存储在内存中(我指的是数组的元素) 假设我声明了某种类型的对象数组,比如Employee class Employee { int x = 10; int y = 20; Employee(int x, int y)
int intArray[] = new intArray[10];
intArray[0] = 10;
intArray[1] = 20;
// and so on...
intArray
如何存储在内存中(我指的是数组的元素)
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);
...
}
}
emparay
在内存中是什么样子的
int
数组:将有一个内存块,其大小是存储值的int
的10倍Employee
数组:将有一个内存块,其大小是对象引用的10倍,每个元素将引用内存中其他地方的Employee
对象(或者它将为null
)考虑以下图像。第一幅图显示了基本类型数组(byte、short、int、long、float、double、char、boolean)如何存储在内存中 作为对象的数组本身使用new关键字进行实例化,并在堆中分配一些内存。但是s由于它是一个基本类型数组,它直接存储的基本类型值与其大小相同。这些值被设置为0(在int基元类型数组的情况下),除非我们使用
intArray[0]=10这样的指令明确地更改它们代码>
但是,在引用类型数组的情况下,有一个有趣的区别数组本身在使用new关键字实例化后,会在堆上分配一些内存空间。但它不直接存储对象,而是存储对其所持有对象的引用。这些引用将为null,或者指向内存中某个位置的相应对象的引用(或地址)。对每个对象的引用都具有默认值null,除非使用类似于empArray[0]=newemployee(10,20)的指令对其进行更改代码>
关于你的后续问题,在一个链表中,假设我试图找到一个位于,比如说从列表头开始的第11个位置的对象,我必须迭代10次才能找到它。因此,linkedlist中元素的大小和位置将影响检索元素所需的时间。然而,在数组中,我只需要知道索引,它就会在一个恒定的时间内找到元素
Java不是一种好的编程语言,不适合使用,也不适合确切了解堆上发生了什么。实际上,它尽了最大的努力让程序员不再承担这一责任。java代表你的内存管理,例如垃圾收集、堆分配等。如果你想了解“靠近金属”的发生,我建议你用C或C++。谢谢你的回复,我有一个后续问题。考虑到emp阵列将在内存中的某些位置创建emp对象的引用。为了从数组中检索对象,假设empArray[1]将分两步完成。1.检查EMPARY[1]位置中的参考地址我有一个后续问题。如果我错了,请纠正我。考虑到emp阵列将在内存中的某些位置创建emp对象的引用。为了从数组中检索对象,假设empArray[1]将分两步完成。1.检查EMPARY[1]位置中存在的引用地址。2.转到地址并获取实际对象。它与链表有什么不同?我觉得数组和链表、元素检索都是一样的,我们如何判断数组中的对象检索速度快呢?链表的组织方式与数组不同。在链表中,每个元素都包含对下一个元素的引用。为了在链表中找到元素编号N,您必须遵循从第一个到第二个、第三个的所有链接。。。直到到达元素N。在数组中,您可以直接获得元素编号N,因为您知道元素编号N位于从数组开始的元素的位置N*大小。