|
1
4
tl;博士操作对对象的引用数组对对象没有影响,并且 对对象的位置没有影响 在记忆中。 物体一个 array 对象的数组实际上是对对象的引用(指针)。一个 pointer 是内存中另一个位置的地址。 我们将数组称为持有对象,但这在技术上并不准确。因为Java本身并不向我们这些程序员公开指针,所以我们通常不知道它们的存在。当我们访问数组中的一个元素时,我们实际上是在检索一个指针,但是Java会紧跟在该指针之后,将对象定位到内存中的其他位置。 在指针指向对象之后,这种自动查找使指针数组感觉像对象数组。Java程序员认为她的数组保存了她的对象,而实际上这些对象是 hop-skip-and-a-jump 走开。 Java中的数组被实现为连续的内存块。对于对象数组,指向这些对象的指针存储在连续内存中。但是当我们访问元素时,我们会跳到内存中的另一个位置来访问我们想要的实际对象。
添加元素可能很便宜,因为如果内存恰好在内存的隔壁可用,则可以将其分配给数组,以便为更多元素腾出空间。实际上这不太可能。很可能必须在内存中的其他地方构建一个新数组,所有指针都被复制到新数组,然后丢弃原始数组。 这样一个新的阵列和复制是昂贵的。如果可行的话,我们想避免这次行动。如果知道数组的最大可能大小,则在声明数组时指定该大小。整个连续内存块将立即声明,数组中的内容为空,直到以后为元素分配指针。 插入数组中间也很昂贵。创建新数组并复制元素,或者必须将插入点之后的所有元素下移到其相邻位置。 对数组的这些操作都不会影响对象。 这些物体漂浮在记忆的乙醚中。对象对数组一无所知。数组上的操作不会影响对象及其在内存中的位置。唯一的关系是,如果数组中保存的引用是最后一个仍然指向对象的引用,那么当该数组元素被清除或删除时,该对象将成为 garbage-collection . 原语
在Java中,8
primitive
类型(
原语数组保存数组本身的值。所以这些值是相邻存储的,在内存中是连续的。没有引用/指针。不要在记忆中乱跳。 至于添加或插入,上面讨论的相同行为也适用。但是,实际的原语值不是指针被乱序排列,而是被乱序排列。
提示在商业应用程序中,通常最好使用对象。
这意味着使用包装类而不是原语。例如,
选择对象意味着使用
与商业应用程序不同,在速度和内存使用率至关重要的极端情况下,比如你的游戏引擎,然后充分利用数组和原语。 |
|
|
2
0
数据或值存储在对象中,并使用对象的引用检索值。lemme clear还有一件事,Java中的数组是以对象的形式存储的。因此毫无疑问,对象存储值并使用该特定对象的引用变量进行访问。希望你明白了。 |
|
|
3
0
Java只处理对对象的引用。因此,不能保证数组的元素在内存中是连续的。 编辑:我猜这个答案不太清楚。我的错。我的意思是不能保证对象本身是连续的,尽管引用是连续的,因为一维数组是连续存储的。尽管如此,巴兹尔·伯克的回答还是完美地解释了这一点。 |