当前位置: 首页 > 面试题库 >

使用.clone()复制2D数组仍引用原始数据

钮鸿煊
2023-03-14
问题内容

我还研究了其他一些主题和网站,它们似乎都提出了比答案更多的问题。

Josh Bloch谈设计 -讨论文章.clone();

但是我仍然无法解决我的问题。

当我克隆二维数组时:

values = Map.mapValues.clone();

我仍然不能安全地修改的内容,values因为它仍然可以修改的内容Map.mapValues

实际上,有没有一种方法比我每次都从头开始重新创建一个数组更有效?

谢谢


问题答案:

在Java中,2D数组是对1D数组的引用的数组Map.mapValues.clone()仅克隆第一层(即引用),因此最终获得了
对相同底层1D数组 的新引用 数组 。这就是为什么您尝试使用clone()无效的原因。

解决此问题的一种方法是也克隆基础的一维数组:

byte[][] values = Map.mapValues.clone();
for (int i = 0; i < values.length; i++) {
  values[i] = values[i].clone();
}


 类似资料:
  • 问题内容: 我有一个二维数组,称为int类型的矩阵,我想用一种方法将其复制到局部变量,以便我可以对其进行编辑 什么是复制阵列的最佳方法,我遇到了一些麻烦 例如 问题答案: 有两种复制数组的好方法是使用clone和。 这是在2D情况下如何使用克隆的方法: 对于System.arraycopy(),你可以使用: 我没有基准,但是我可以用我的2美分打赌,它们比你自己做的更快,更不容易出错。特别是,它是用

  • 问题内容: 我正在尝试初始化一个2D数组,其中每个元素的类型为 char 。到目前为止,我只能按照以下方式初始化此数组。 我认为如果数组是10 * 10,这是简单的方法。 有什么有效的方法吗? 问题答案: 这样的事情怎么样: 以下完整的Java程序: 输出: 之所以有效,是因为Unicode中的数字是连续的,从\ u0030开始(这是您从中得到的)。 表达式(您可以在其中变化以及介于两者之间(包括

  • 我有以下课程: 现在,我需要使用以下项目初始化2D数组: 我看了这个例子,但它在我的情况下不起作用:Java8流和数组操作。它们使用单个。 问:当然我可以使用嵌套for循环,但我认为它现在已经过时了,而且被认为是不好的。那么,如何应用streams api并以Java8的方式初始化它呢?

  • 问题内容: 我正在尝试从原始数组制作一个列表 但是最后一个函数给我一个错误,因为它需要其他参数。它需要3个参数Supplier,ObjIntConsumer和BiConsumer。 当我看到仅使用并获取列表的不同示例时,我不明白为什么它要3个参数。 我做错了什么? 问题答案: 是的,因为返回。您可以调用获取一个,然后执行收集操作。

  • 我有一个2维数组。 类似于, (0,1) (0,2) (0,3) (1,1) (1,3) (2,1) (2,2) (2,3) (2,3) (2,3) (2,3) (2,3) (2,3) (2,3) (2,3) (2,3) (2,3) (2,3) (2, 如何使用仅复制新数组中的第二个索引。 仅像, (2,1) (2,2) (2,3) 或者有没有别的办法。

  • 我在网上阅读,找到了引用数组存储引用。如果我没有弄错的话,数组将存储变量的内存地址。如果这就是为什么我在循环字符串数组时看不到内存地址的原因,如下所示。 现在根据定义,arrNames数组将在arrNames[0]、arrNames[1]、arrNames[2]存储引用。这意味着内存地址将指向名字,如eJohn,Max和Alex。 如果它是基元数组,它将直接存储如下所示的值。 Num[0]将直接保