Joz*_*100 1 java arrays data-structures
我正在阅读有关数据局部性的内容,并希望用它来改进我正在编写的游戏引擎。
假设我在不同的时间创建了五个对象,它们现在都位于内存中的不同位置,而不是彼此相邻。如果我将它们全部添加到一个数组中,该数组是否只保存指向这些对象的指针,它们将保留在内存中的同一位置,还是将它们全部添加到一个数组中,重新排列它们并使它们连续。
我问这个是因为我认为使用数组是使它们连续的好方法,但我不知道数组是否能解决我的问题!
操作对对象的引用数组对对象没有影响,对对象在内存中的位置也没有影响。
一个阵列的对象是实在的引用(指针)的阵列的对象。甲指针是地址在存储器的另一个位置。
我们将数组称为保存对象,但这在技术上并不准确。因为 Java 不会向我们程序员公开指针本身,所以我们通常不知道它们的存在。当我们访问数组中的一个元素时,我们实际上是在检索一个指针,但 Java 会立即跟随该指针来定位内存中其他位置的对象。
这种跟随指向对象的指针的自动查找使指针数组感觉就像一个对象数组。Java 程序员认为她的数组保存了她的对象,而实际上这些对象是一跳一跳的。
Java 中的数组被实现为连续的内存块。对于对象数组,指向这些对象的指针存储在连续内存中。但是当我们访问元素时,我们正在跳转到内存中的另一个位置来访问我们想要的实际对象。
添加元素可能是“便宜的”,因为如果内存恰好在内存的隔壁可用,则可以将其分配给数组以为更多元素腾出空间。在实践中这是不可能的。可能必须在内存中的其他地方构建一个新数组,所有指针都被复制到新数组,然后丢弃原始数组。
这种新的数组和复制是“昂贵的”。在可行的情况下,我们希望避免这种操作。如果您知道数组可能的最大大小,请在声明数组时指定该大小。整个连续内存块立即被占用,数组中的内容为空,直到您稍后为元素分配一个指针。
插入到数组的中间也很昂贵。要么构建新数组并复制元素,要么必须将插入点之后的所有元素向下移动到其相邻位置。
这些对数组的操作都不会影响对象。这些对象漂浮在记忆的以太中。对象对数组一无所知。对数组的操作不会影响对象及其在内存中的位置。唯一的关系是,如果数组中保存的引用是最后一个仍然指向该对象的引用,那么当该数组元素被清除或删除时,该对象将成为垃圾收集的候选对象。
在Java中,八个原始类型(byte,short,int,long,float,double,boolean,和char)不是对象/类和不面向对象编程。与对象相比,其优点之一是速度快且占用内存少。
原语数组保存数组本身中的值。因此,这些值彼此相邻存储,在内存中是连续的。没有参考/指针。没有在内存中跳来跳去。
至于添加或插入,上面讨论的相同行为也适用。除了指针没有被打乱之外,实际的原始值正在被打乱。
在业务应用程序中,通常最好使用对象。
这意味着使用包装类而不是原语。例如,Integer代替int. Java 中的自动装箱功能通过在原始值和它们的对象包装器之间自动转换使这变得更容易。
首选对象意味着使用 aCollection而不是数组,通常是 a List,特别是 a ArrayList。或者对于不可变用途,List从新List.of方法返回的实现。
与商业应用程序相比,在速度和内存使用率至关重要的极端情况下,例如您的游戏引擎,则应充分利用数组和原语。
| 归档时间: |
|
| 查看次数: |
1420 次 |
| 最近记录: |