首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java数组移位引用

Java数组移位引用
EN

Stack Overflow用户
提问于 2017-02-04 07:23:23
回答 2查看 50关注 0票数 0

我试着换了一个数组,但我有问题。

移位数组的代码如下:

代码语言:javascript
运行
复制
for(int i = (size - 1); i >= 0; i--)
{
    data2[i+1] = data2[i];
}

数组init (从另一个数组复制)

代码语言:javascript
运行
复制
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,我只想操作和使用data1 -> data3的数据。但是,如果数据的数据发生变化,data1的数据也会发生变化。这是什么原因?

例:

数据2: 6-1 数据21: 6-1 数据22: 4-8 数据23: 9-5

代码语言:javascript
运行
复制
data2[0].setElementTwo(3);

资料2: 6-3 数据21: 6-3 数据22: 4-8 数据23: 9-5

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

-edit为了清晰-

全伪码:

代码语言:javascript
运行
复制
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]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-04 07:51:23

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

问题就在这一行上:

代码语言:javascript
运行
复制
data2[i+1] = data2[i];

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

为了简化这种情况,让我们假设i是0,所以现在行变成:

代码语言:javascript
运行
复制
data2[1] = data2[0];

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

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

代码语言:javascript
运行
复制
data2[0].setElementTwo(3);

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

要解决这个问题,您需要替换这一行:

代码语言:javascript
运行
复制
data2[i+1] = data2[i];

就像这样:

代码语言:javascript
运行
复制
data2[i+1] = new obj(...); 
// you should create a new obj that has the same values as data2[i] using its constructor
票数 2
EN

Stack Overflow用户

发布于 2017-02-04 07:28:58

新的data2[]引用的是旧的data[],所以旧的变化将反映在新的。如果你不想那样做

代码语言:javascript
运行
复制
 data[index] = new obj(data[i-1]) ;

这将创建一个新对象,它基本上是旧对象的副本,并且相互排斥。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42037714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档