gpt4 book ai didi

java - 我如何在 Java 中一次更改多个引用?

转载 作者:行者123 更新时间:2023-11-30 11:51:51 25 4
gpt4 key购买 nike

我有一个包含对象引用的数组。我想将数组中的一些引用更改为另一个对象。目前我使用如下所示的 for 循环:

for (int i = region2.getStartPos(); i <= curPos; i++) {        
if (regions[i] == region2) {
regions[i] = region1;
}
}

不过我想避免 for 循环,因为它会增加计算的复杂性。

有没有办法让region2引用的对象直接等于region1引用的对象?例如,我曾尝试在 Region 类中编写一个方法,如下所示,但它给了我一个“无法为最终变量赋值”的错误。

public void mergeRegions(Region region){
this = region;
}

这样的事情可能吗?

最佳答案

Java 中的每个引用只是内存中某个对象的地址,因此如果没有一些额外的代码,您要求的那种“自动更新”是不可能的。

假设region1引用内存中的地址0x1001region2引用0x2001。这两个内存位置保存实际区域数据:

  • 0x1001:x = 0,y = 5,宽度 = 20,高度 = 30
  • 0x2001:x = 100,y = 200,宽度 = 50,高度 = 20

如果你能以某种方式告诉 0x2001 处的对象等于 0x1001,使用你的 mergeRegions 方法,Java 会尝试做一些事情吗像这样?

  • 0x1001:x = 0,y = 5,宽度 = 20,高度 = 30
  • 0x2001:0x1001

但这行不通,因为 Java 对象都应该是 Region 对象,每个对象都具有相同的字段和方法。如果我们清除 0x2001 处的 Java 对象,并只放入一个普通地址,则对 0x2001 的现有引用都不起作用,因为它们都期待一个该地址的 Region 对象。这就是为什么不能将一个 Java 引用“直接分配”给另一个。

以下是帮助您重新设计算法的三个提示:

  1. 不是将地址 0x1001 复制到 0x2001,而是将 0x1001 中的所有数据复制到位于 0x2001 的对象中。这将使两个对象等效,但分开。
  2. 您可以引入一层间接寻址。如果您了解 C,请考虑“指向指针的指针”。您的 regions 数组将保存对 IndirectRegion 对象的引用,该对象又将保存对实际 Region 对象的引用。当你想更新 region2region1 时,你只需要请求其中一个 IndirectRegion 对象来更新它的内部引用。
  3. 等到算法结束后再合并区域。如果您能够收集所有合并操作,您可能能够在单个 O(n) 循环中执行所有这些操作。

关于java - 我如何在 Java 中一次更改多个引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7222676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com