Копирование 2D-массива с использованием .clone () все еще ссылается на исходные данные - PullRequest
3 голосов
/ 28 ноября 2011

Хорошо, я знаю, что этот вопрос задавался ранее: Предыдущий вопрос

Я также просмотрел несколько других тем и веб-сайтов, и все они, кажется, создают больше вопросов, чем ответов.

Джош Блох о дизайне - статья, обсуждающая .clone();

Но я все еще не мог найти ответ на мою проблему.

Когда я клонирую свой 2D-массив:

values = Map.mapValues.clone();

Я все еще не могу безопасно изменить содержимое values, поскольку оно все еще изменяет содержимое Map.mapValues.

Есть ли способ скопировать массив, более эффективный, чем я, просто заново создавать его с нуля?

Спасибо

1 Ответ

7 голосов
/ 28 ноября 2011

В Java 2D-массив - это массив ссылок на одномерные массивы. Map.mapValues.clone() клонирует только первый слой (то есть ссылки), так что вы получите новый массив ссылок на тех же базовых 1D массивов . Вот почему ваша попытка использовать clone() не сработала.

Одним из способов решения этой проблемы является клонирование базовых 1D-массивов:

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