代码之家  ›  专栏  ›  技术社区  ›  Joza100

Java中的Do数组存储数据或指针

  •  1
  • Joza100  · 技术社区  · 8 年前

    我正在阅读关于数据区域性的内容,并希望使用它来改进我正在编写的游戏引擎。

    假设我在不同的时间创建了五个对象,它们现在都位于内存中的不同位置,而不是彼此相邻。如果我将它们全部添加到一个数组中,该数组是否只保存指向这些对象的指针,并且它们将保留在内存中的同一位置,或者将它们全部添加到一个数组中,重新排列它们并使它们连续。

    我这么问是因为我认为使用数组是使它们连续的好方法,但是我不知道数组是否能解决我的问题!

    3 回复  |  直到 8 年前
        1
  •  4
  •   Basil Bourque    8 年前

    tl;博士

    操作对对象的引用数组对对象没有影响,并且 对对象的位置没有影响 在记忆中。

    物体

    一个 array 对象的数组实际上是对对象的引用(指针)。一个 pointer 是内存中另一个位置的地址。

    我们将数组称为持有对象,但这在技术上并不准确。因为Java本身并不向我们这些程序员公开指针,所以我们通常不知道它们的存在。当我们访问数组中的一个元素时,我们实际上是在检索一个指针,但是Java会紧跟在该指针之后,将对象定位到内存中的其他位置。

    在指针指向对象之后,这种自动查找使指针数组感觉像对象数组。Java程序员认为她的数组保存了她的对象,而实际上这些对象是 hop-skip-and-a-jump 走开。

    Java中的数组被实现为连续的内存块。对于对象数组,指向这些对象的指针存储在连续内存中。但是当我们访问元素时,我们会跳到内存中的另一个位置来访问我们想要的实际对象。

    enter image description here

    添加元素可能很便宜,因为如果内存恰好在内存的隔壁可用,则可以将其分配给数组,以便为更多元素腾出空间。实际上这不太可能。很可能必须在内存中的其他地方构建一个新数组,所有指针都被复制到新数组,然后丢弃原始数组。

    这样一个新的阵列和复制是昂贵的。如果可行的话,我们想避免这次行动。如果知道数组的最大可能大小,则在声明数组时指定该大小。整个连续内存块将立即声明,数组中的内容为空,直到以后为元素分配指针。

    插入数组中间也很昂贵。创建新数组并复制元素,或者必须将插入点之后的所有元素下移到其相邻位置。

    对数组的这些操作都不会影响对象。 这些物体漂浮在记忆的乙醚中。对象对数组一无所知。数组上的操作不会影响对象及其在内存中的位置。唯一的关系是,如果数组中保存的引用是最后一个仍然指向对象的引用,那么当该数组元素被清除或删除时,该对象将成为 garbage-collection .

    原语

    在Java中,8 primitive 类型( byte , short , int , long , float , double , boolean ,和 char )不是对象/类 Object-Oriented Programming . 与对象相比,它们的一个优点是速度快,占用的内存少。

    原语数组保存数组本身的值。所以这些值是相邻存储的,在内存中是连续的。没有引用/指针。不要在记忆中乱跳。

    至于添加或插入,上面讨论的相同行为也适用。但是,实际的原语值不是指针被乱序排列,而是被乱序排列。

    enter image description here

    提示

    在商业应用程序中,通常最好使用对象。

    这意味着使用包装类而不是原语。例如, Integer 而不是 内景 . 这个 auto-boxing Java中的工具通过在原语值和它们的对象包装器之间自动转换使这一点变得更容易。

    选择对象意味着使用 Collection 而不是数组,通常是 List ,特别是 ArrayList . 或者对于不可改变的用途 列表 从新的 List.of 方法。

    与商业应用程序不同,在速度和内存使用率至关重要的极端情况下,比如你的游戏引擎,然后充分利用数组和原语。

        2
  •  0
  •   Adhi mourya    8 年前

    数据或值存储在对象中,并使用对象的引用检索值。lemme clear还有一件事,Java中的数组是以对象的形式存储的。因此毫无疑问,对象存储值并使用该特定对象的引用变量进行访问。希望你明白了。

        3
  •  0
  •   Ricardo Costeira    8 年前

    Java只处理对对象的引用。因此,不能保证数组的元素在内存中是连续的。

    编辑:我猜这个答案不太清楚。我的错。我的意思是不能保证对象本身是连续的,尽管引用是连续的,因为一维数组是连续存储的。尽管如此,巴兹尔·伯克的回答还是完美地解释了这一点。

    推荐文章