java如何存储数据结构

时间:2011-03-19 18:38:43

标签: java

我找不到任何好的答案,但在数组等数据结构中,java存储数组中的对象或指向所述对象的指针,

这是一个相关的例子,我有一个占用50个字节的对象,并希望以2种不同的方式组织它,而不必在每次搜索之前对其进行排序,因此我将它放在2个数组中。假设指针是2字节,则需要2 * 50 * n字节或((2 * 2)+50)* n

我明白这不是确切的但是如果n是2000就会很接近

5 个答案:

答案 0 :(得分:2)

在Java中,有两种主要类型 - 基元和对象。对象始终存储在堆中,而变量是指针。例如int[]存储值,而Integer[]存储指向具有Integer字段的int个实例的指针。

答案 1 :(得分:2)

每个对象只有一个副本,并且每个数组都会存储一个引用。尽管它对您来说是透明的,但您创建的对象实际上并未存储在数组内部,该数组只是Java用于指示“按此顺序排列的这一系列对象”的机制。数组实际包含的是一系列指针,它们是32位或64位(取决于程序运行的硬件)。对象的大小无关紧要,指针仍然是相同的。

因此,如果要将这两个对象存储在两个不同的数组中,则使用的内存总量将为n*50+2*2*nn*50因为存储这些对象需要多少内存,2*2*n用于构成每个数组的两组指针。

答案 2 :(得分:2)

Java中的所有对象都是通过引用处理的 - 当您拥有除基本数据类型之外的任何数组时,该数组仅包含指针。不可能(因为它在C中)构造一个存储值而不是引用的数组(或者,就此而言,任何其他类型的对象)。

所以为了回答上面的例子,Java数组需要((2 * 2)+50)* n个字节。两个指针数组为2 * 2 * n,对象为n * 50。

答案 3 :(得分:0)

在Java中,所有对象都是指针。因此,任何与其内容对象无关的数组都具有相同的大小。

答案 4 :(得分:0)

其他几个人已回答了当前的问题。我只想补充两点:

  1. 琐碎的技术性:我认为Java中的指针通常是4个字节,虽然这在任何规范中都没有指定,因此依赖于实现。

  2. 绝对不是一个微不足道的技术性:数组中存储的不是对象本身而是指针 - 在Java术语中称为“句柄”。因此,假设您有两个指向同一对象集的数组,比如“arrayByFoo”和“arrayByBar”,而arrayByFoo [42]指的是与arrayByBar [27]相同的对象。然后你说arrayByFoo [42] .setPlugh(3)。你已经改变了OBJECT,所以如果你以后说arrayByBar [27] .getPlugh(),它应该返回更新的值,3。

  3. 另一方面,如果你说arrayByFoo [42] = new MyObject(),你现在已经改变了引用,所以arrayByFoo [42]不再等于arrayByBar [27]。 arrayByBar仍然指向旧对象,而arrayByFoo现在指向新对象。 (当然,假设你还没有更新arrayByBar。)