Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

Техники копирования массивов в Java: подробное руководство

Техники копирования массивов в Java

Научитесь дублировать одномерные и двумерные массивы в Java с помощью присваивания, циклов, System.arraycopy, Arrays.copyOfRange и других методов, с наглядными примерами и лучшими практиками.


1. Копирование оператором присваивания

Присваивание одной массивной переменной другой — самый простой метод. Он копирует ссылку, а не данные.

class Main {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5, 6};
        int[] positiveNumbers = numbers; // копирование ссылки
        for (int number: positiveNumbers) {
            System.out.print(number + ", ");
        }
    }
}

Вывод:

1, 2, 3, 4, 5, 6

Теперь numbers и positiveNumbers указывают на один и тот же объект массива. Изменение одного элемента влияет на другой:

class Main {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5, 6};
        int[] positiveNumbers = numbers;
        numbers[0] = -1;
        for (int number: positiveNumbers) {
            System.out.print(number + ", ");
        }
    }
}

Вывод:

-1, 2, 3, 4, 5, 6

Это поверхностное копирование (shallow copy). Чтобы избежать побочных эффектов, используйте глубокое копирование.


2. Глубокое копирование с циклом

Итерация по каждому элементу и присваивание его новому массиву создает независимую копию.

import java.util.Arrays;
class Main {
    public static void main(String[] args) {
        int[] source = {1, 2, 3, 4, 5, 6};
        int[] destination = new int[source.length];
        for (int i = 0; i < source.length; ++i) {
            destination[i] = source[i];
        }
        System.out.println(Arrays.toString(destination));
    }
}

Вывод:

[1, 2, 3, 4, 5, 6]

Поскольку source и destination — разные объекты, изменения одного не затрагивают другой.


3. Использование System.arraycopy()

Метод System.arraycopy в Java предлагает быстрый встроенный способ копирования сегментов массивов.

arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

Пример:

import java.util.Arrays;
class Main {
    public static void main(String[] args) {
        int[] n1 = {2, 3, 12, 4, 12, -2};
        int[] n2 = new int[n1.length];
        System.arraycopy(n1, 0, n2, 0, n1.length);
        System.out.println("n2 = " + Arrays.toString(n2));
        int[] n3 = new int[5];
        System.arraycopy(n1, 2, n3, 1, 2);
        System.out.println("n3 = " + Arrays.toString(n3));
    }
}

Вывод:

n2 = [2, 3, 12, 4, 12, -2]
n3 = [0, 12, 4, 0, 0]

4. Копирование с Arrays.copyOfRange()

Когда нужен новый массив, содержащий конкретный срез, Arrays.copyOfRange идеален.

import java.util.Arrays;
class ArraysCopy {
    public static void main(String[] args) {
        int[] source = {2, 3, 12, 4, 12, -2};
        int[] destination1 = Arrays.copyOfRange(source, 0, source.length);
        System.out.println("destination1 = " + Arrays.toString(destination1));
        int[] destination2 = Arrays.copyOfRange(source, 2, 5);
        System.out.println("destination2 = " + Arrays.toString(destination2));
    }
}

Вывод:

destination1 = [2, 3, 12, 4, 12, -2]
destination2 = [12, 4, 12]

5. Копирование 2D массивов циклом

Глубокое копирование двумерного массива требует копирования каждой строки отдельно.

import java.util.Arrays;
class Main {
    public static void main(String[] args) {
        int[][] source = {
            {1, 2, 3, 4},
            {5, 6},
            {0, 2, 42, -4, 5}
        };
        int[][] destination = new int[source.length][];
        for (int i = 0; i < destination.length; ++i) {
            destination[i] = new int[source[i].length];
            for (int j = 0; j < destination[i].length; ++j) {
                destination[i][j] = source[i][j];
            }
        }
        System.out.println(Arrays.deepToString(destination));
    }
}

Вывод:

[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]

6. Копирование 2D массива с System.arraycopy()

Замените внутренний цикл на arraycopy для более чистого кода.

import java.util.Arrays;
class Main {
    public static void main(String[] args) {
        int[][] source = {
            {1, 2, 3, 4},
            {5, 6},
            {0, 2, 42, -4, 5}
        };
        int[][] destination = new int[source.length][];
        for (int i = 0; i < source.length; ++i) {
            destination[i] = new int[source[i].length];
            System.arraycopy(source[i], 0, destination[i], 0, destination[i].length);
        }
        System.out.println(Arrays.deepToString(destination));
    }
}

Вывод:

[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]

java

  1. Массивы в C#: объявление, инициализация и операции
  2. Освоение операторов Java: типы, синтаксис и практические примеры
  3. Комментарии в Java: типы, использование и лучшие практики
  4. Интерфейсы в Java: концепции, реализация и лучшие практики
  5. Try-with-resources в Java: автоматическое управление ресурсами
  6. Аннотации в Java: типы, размещение и практические примеры
  7. Массивы в C++: объявление, инициализация и работа с указателями
  8. Динамическое выделение массивов в C++: практическое руководство с примерами кода
  9. Учебник по массивам в Java: объявление, создание и инициализация с примерами кода
  10. Создание массива объектов в Java: пошаговое руководство