java - 对已创建对象进行新引用的处理成本?

标签 java memory reference

我正在制作一款游戏,我需要判断有多少辆汽车正在接触玩家的汽车,以及哪些汽车。我的计划是创建一个 List,并在必要时添加和删除汽车。

这是我的问题。我的 Car 类创建起来非常昂贵(处理能力方面)。创建一辆汽车的引用要花多少钱?我知道在 C++ 中我所说的被称为指针。这是代码示例:

Car newCar = new Car(); // expensive
Car carCopy = newCar.clone(); // expensive
Car referenceNewCar = newCar; // expensive?

referenceNewCar 应该指向内存中与 newCar 相同的位置,对吧?所以它不必初始化任何东西,并且说 newCar.changeMemberVariableTo(1)referenceNewCar.changeMemberVariableTo(1) 相同;无论哪种方式,newCarreferenceNewCar 都会受到影响,因为它们指向内存中的同一个位置。

我假设创建一个新的引用比一个全新的 Car 更便宜。它快多少?如果创建一个新的 Car 需要 3 秒,那么创建对同一辆车的新引用是否几乎是瞬间的?

提前致谢。

最佳答案

将引用从一个变量复制到另一个变量非常便宜。它可能与复制 intlong 值一样便宜(取决于所讨论的 JVM 的一些情况)。

您所得到的只是两个具有完全相同值的变量 - 一个引用。该值将非常小(在大多数实现中为 4 或 8 个字节)并且复制它通常不需要比复制字节更多的工作。

(我暗暗怀疑一些 JVM 可能比这更聪明一些;为了垃圾收集,一些 JVM 可能会更新最老一代的标志例如,对特定对象的引用 - 但这会因实现而异,无论如何我的内存可能是错误的。)

关于java - 对已创建对象进行新引用的处理成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17902720/

相关文章:

java - 反转链表模板类

linux - 重击 :/proc/sys/vm/drop_caches: Permission denied

java - BigInteger 占用大量内存

c++ - 为什么我们必须将值而不是地址传递给 C++ 中的 "call by reference"函数?

java - 我如何确定何时可以重用对象?

java - 作为 war 运行时从 UI 升级 Jenkins

java - 将 JSON 反序列化为现有对象 (Java)

java - 在 Java 中恢复 SSL X509TrustManager

memory - Matlab:调用函数后空闲内存丢失

reference - Xtext 交叉引用和范围界定