首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >int[][]是一个基本类型吗?或者它是否用克隆()方法生成不同的实例?

int[][]是一个基本类型吗?或者它是否用克隆()方法生成不同的实例?
EN

Stack Overflow用户
提问于 2019-03-22 23:03:56
回答 2查看 116关注 0票数 2

我正在与一个intn董事会合作:

代码语言:javascript
复制
0 2 3 
4 1 5 
7 8 6 

我想复制一个名为孪生,然后返回修改的副本。

例如:

代码语言:javascript
复制
    int [][] twin = board.clone();

    twin[0][0] = board[0][1];
    twin[0][1] = board[0][0];

    return twin;

我所期望的是:

代码语言:javascript
复制
//board
0 2 3 
4 1 5 
7 8 6 

//twin
2 0 3 
4 1 5 
7 8 6 

但结果是:

代码语言:javascript
复制
//board
2 2 3 
4 1 5 
7 8 6 

//twin
2 2 3 
4 1 5 
7 8 6 

董事会和双胞胎一直是一样的,克隆人没有像预期的那样工作。是因为int不是一个对象吗?

有没有一种方法可以克隆int并修改我所期望的方式?我是否应该在板上循环并将值复制到孪生?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-22 23:13:17

首先,数组不是原始类型;它是一个对象。第二,多维数组被实现为数组数组。此外,数组的clone方法也很浅。当您clone多维数组时,您的新多维数组仍然引用原始的内部数组。

代码语言:javascript
复制
board -> [ .           .           . ]
           |           |           |
           v           v           v
          [0, 2, 3], [4, 1, 5], [7, 8, 6]
           ^           ^           ^
           |           |           |
 twin -> [ .           .           . ]

因此,当您修改值时,您不是从两个不同的数组复制,而是从同一个数组进行复制,这就是为什么您最终得到了2、2、3。

如果你要克隆一个多维数组,你需要一直克隆到一维数组。

代码语言:javascript
复制
int [][] twin = board.clone();
for (int i = 0; i < board.length; i++) {
    twin[i] = board[i].clone();
}

现在我得到了[[2, 0, 3], [4, 1, 5], [7, 8, 6]]

其他可能性包括在不进行克隆的情况下声明新的多维数组,以及使用循环和System.arraycopy复制单个一维数组。

票数 6
EN

Stack Overflow用户

发布于 2019-03-23 00:16:04

引用JLS 第10章.阵列

在Java编程语言中,数组是对象

没有int[][]不是原语。

引用JLS 10.7.数组成员

多维数组的克隆很浅,也就是说它只创建一个新数组。子数组是共享的。

外部数组是一个新实例,子数组不是。

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

https://stackoverflow.com/questions/55308858

复制
相关文章

相似问题

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