Java 数组移位引用

标签 java arrays pointers

我尝试移动数组,但遇到问题。

移动数组的代码如下:

for(int i = (size - 1); i >= 0; i--)
{
    data2[i+1] = data2[i];
}

数组初始化(从另一个数组复制)

obj[] data = new obj[size];

obj[] data2 = new obj[size + 1];

for(int i = 1; i <= size; i++)
{
    data2[i] = data[i-1];
}

data2[0] = data[0];

例如,如果 size = 3,我只想操作和使用 data[1] -> data[3] 的数据。但是,如果 data[0] 的数据发生变化,data[1] 的数据也会发生变化。是什么原因造成的?

例如:

Data 2[0]: 6----1----0----0

Data 2[1]: 6----1----0----0

Data 2[2]: 4----8----0----0

Data 2[3]: 9----5----0----0

data2[0].setElementTwo(3);

Data 2[0]: 6----3----0----0

Data 2[1]: 6----3----0----0

Data 2[2]: 4----8----0----0

Data 2[3]: 9----5----0----0

我将第一个数组复制到第二个数组,因为 data[] 是在另一个从 0->size 生成的类中生成的,而程序的这一部分需要 1->size+1。

-为了清晰起见进行编辑-

完整的伪代码:

obj[] data = new obj[size];

obj[] data2 = new obj[size + 1];

for(int i = (size - 1); i >= 0; i--)
{
    data2[i+1] = data2[i];
}

for(int i = 1; i <= size; i++)
{
    data2[i] = data[i-1];
}

data2[0] = data[0];

// print data2 0->3

// change data2[0] value

// print data2 0->3, values would have changed for data[0] and data[1]
// but I only want to change values for data[0] and not data[1]

最佳答案

首先,让我澄清一些概念。 obj 是一个引用类型。引用类型的变量保存对实际对象的引用。当您执行aRefVariable = anotherRefVariable时,您并不是在创建新对象。相反,您是说 aRefVariable 应该与 anotherRefVariable 保持相同的引用。基本上,执行该行后,这两个变量指向同一个对象。

问题出在这一行:

data2[i+1] = data2[i];

您是说 data2[i+1] 应该与 data2[i] 保持相同的引用。

为了简化情况,我们假设 i 为 0,因此该行现在变为:

data2[1] = data2[0];

正如我所说,data2 的第二个和第一个元素现在指向同一个对象。就获取的对象而言,访问 data2[0]data2[1] 完全相同。

很好,让我们修改 data2 第一项的对象:

data2[0].setElementTwo(3);

现在 data2[0] 引用的对象已被修改。当您尝试访问 data2[1] 时,您也会看到修改。为什么?因为 data2[0]data2[1] 指的是同一个东西!

要解决此问题,您需要替换此行:

data2[i+1] = data2[i];

像这样:

data2[i+1] = new obj(...); 
// you should create a new obj that has the same values as data2[i] using its constructor

关于Java 数组移位引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42037714/

相关文章:

c++ - 在逻辑电路模拟器中检测环路

Java Sockets 并发线程太慢

java - 如何从浏览器访问安卓

java - 如何通过 Selenium 捕获网页中 WebElement 的屏幕截图,而不是整个屏幕或页面

java - java中Jtable到TextArea

arrays - PowerShell 函数永远不会返回空数组

javascript - 在 View 中使用时,保存在 app.locals 中的值数组会丢失其数组格式。这里发生了什么?

PHP - 使用循环将数据上传到数据库

c - 运行时错误: to create a binary tree

c++ - 指针和循环依赖