Как скопировать массив в java
Перейти к содержимому

Как скопировать массив в java

  • автор:

Как скопировать массив?

Object.clone() и System.arraycopy(). Нативные способы копирования, самые быстрые из возможных. Унаследованный от базового класса clone() копирует весь массив без лишних аргументов. arraycopy() , наоборот, максимально гибкий – позволяет копировать часть массива и указывать массив, в который копировать.

Arrays.copyOf(), Arrays.copyOfRange() и все их перегрузки. Утилитарные методы, которые дают более специализированные способы копирования. Внутри все используют System.arraycopy() .

Копирование через стрим. Arrays.stream(sourceArray).toArray() . Удобно когда нужно встроить дополнительные промежуточные операции.

Сторонними библиотеками. Обычно обеспечивают дополнительные удобства, такие как проверка корректности параметров, приведения типов, и прочие. Пример – класс SerializationUtils из Apache Commons.

Все перечисленные способы создают поверхностную копию – оба массива в итоге ссылаются на одни и те же объекты. Лучший способ создать глубокую копию – реализовать ее вручную. Сначала оператором new создается пустой массив нужного размера, затем в цикле заполняется копиями элементов. Stream API здесь может дать удобный интерфейс реализации, и оптимизировать копирование с помощью многопоточности.

Самый быстрый, но ужасный по эффективности способ глубокого копирования массива без реализации копирования отдельных элементов – сериализация+десериализация. Сложно придумать оправдание такому плохому способу для продакшна, но этот метод вполне подходит для реализации быстрого прототипа, или для тестового кода.

Скопируйте массив объектов в Java

В этом посте будет обсуждаться, как скопировать массив объектов в новый массив в Java.

Мы обсудили, как скопировать примитивный массив в новый массив в Java в предыдущий пост. В этом посте мы обсудим, как мы можем скопировать массив объектов.

1. Использование System.arraycopy() метод

System.arraycopy() просто копирует массив из указанного исходного массива, начиная с указанной позиции, в указанную позицию целевого массива. Если исходный массив содержит ссылочные элементы, они также копируются.

import java . util . Arrays ;
class Main
// Общий метод для копирования массива объектов из `source[]` в `dest[]`
private static void copyArray ( T [ ] source , T [ ] dest )
System . arraycopy ( source , 0 , dest , 0 , source . length ) ;
// Программа для копирования массива объектов в Java
public static void main ( String [ ] args )
Integer [ ] source = < 1 , 2 , 3 , 4 , 5 >;
Integer [ ] dest = new Integer [ source . length ] ;
copyArray ( source , dest ) ;
if ( Arrays . equals ( source , dest ) ) < System . out . println ( "Copied successfully: " + Arrays . toString ( dest ) ) ;

результат:

Copied successfully: [1, 2, 3, 4, 5]

Приведенный выше код эквивалентен:

// Общий метод для копирования массива объектов из `source[]` в `dest[]`
private static void copyArray ( T [ ] source , T [ ] dest )
for ( int i = 0 ; i < source . length ; i ++ ) < dest [ i ] = source [ i ] ;

2. Использование Object.clone() метод

Мы знаем, что массивы — это объекты в Java, и все методы класса Object класс может быть вызван для массива.

Object класс имеет clone() метод для копирования объектов в Java, а поскольку массивы рассматриваются как объекты, мы можем использовать этот метод и для копирования массивов.

import java . util . Arrays ;
class Main
// Метод для копирования массива объектов в Java
private static T [ ] copyArray ( T [ ] source )
return source . clone ( ) ;
// Программа для копирования массива объектов в Java
public static void main ( String [ ] args )
Integer [ ] source = < 1 , 2 , 3 , 4 , 5 >;
Integer [ ] dest = copyArray ( source ) ;
if ( Arrays . equals ( source , dest ) ) < System . out . println ( "Copied successfully: " + Arrays . toString ( dest ) ) ;

результат:

Copied successfully: [1, 2, 3, 4, 5]

Обратите внимание, что Object.clone() метод создает мелкая копия массива, т. е. новый массив может ссылаться на те же элементы, что и исходный массив. Для иллюстрации рассмотрим следующий пример:

import java . util . Arrays ;
class Main
// Программа для демонстрации поверхностного копирования массива в Java
public static void main ( String [ ] args )
Integer [ ] i = < 1 , 2 , 3 , 4 , 5 >;
// исходный массив содержит ссылку
Object [ ] source = < i >;
// копирование с помощью `clone()`
Object [ ] dest = source . clone ( ) ;
if ( source [ 0 ] == dest [ 0 ] ) < System . out . println ( "Shallow copy" ) ;

результат:

Shallow copy

3. Использование Arrays.copyOf() метод

Arrays.copyOf() также может использоваться для копирования указанного массива в новый массив, как показано ниже. Если указанный массив содержит какие-либо ссылочные элементы, этот метод также выполняет поверхностное копирование.

// Метод для копирования массива объектов в Java
private static T [ ] copyArray ( T [ ] source )
return Arrays . copyOf ( source , source . length ) ;

Arrays.copyOf() имеет перегруженная версия где мы можем указать Type полученного массива.

// исходный массив
Number [ ] source = < 1 , 2 , 3 , 4 , 5 >;
// получаем `Integer[]` из `Number[]`
Integer [ ] dest = Arrays . copyOf ( source , source . length , Integer [ ] . class ) ;

4. Использование Arrays.copyOfRange() метод

Arrays также обеспечивает copyOfRange() метод, аналогичный copyOf() но только копирует элементы между указанным диапазоном в новый массив.

// Метод для копирования массива объектов в Java
private static T [ ] copyArray ( T [ ] source )
return Arrays . copyOfRange ( source , 0 , source . length ) ;

Похожий на Arrays.copyOf() , создается поверхностная копия исходного массива, а также у него есть перегруженная версия, в которой мы можем указать Type полученного массива.

5. Сериализация массива объектов с помощью GSON

Мы видели, что во всех рассмотренных выше подходах создается поверхностная копия массива, но это то, чего нам может не хотеться. Одним из простых решений этой проблемы является Serialization. Для иллюстрации следующий код возвращает глубокую копию массива путем сериализации массива с помощью библиотеки Google Gson.

Копирование значений одного массива в другой

Помогите исправить метод. Цель метода: скопировать в новый массив все значения, которые входят в диапазон. Метод принимает заранее созданный массив, начало диапазона и конец диапазона, но возвращает метод массив заполненный только одним числом, которое входит в диапазон. Теоретически это должно выглядеть так:

массив 1 = (34, 10, 56, 79, 0, 48) 

пользователь ввел 40 и 80, результат:

2 массив = (56, 79, 48) 

А практически выходит:

массив 1 = (34, 10, 56, 79, 0, 48) 

пользователь ввел 40 и 80, результат:

2 массив = (48, 48, 48) 
public int[] newArray(int[] array, int diaposonStarts, int diaposonEnds) < int count = 0; for (int i = 0; i < array.length; i++) < if (array[i] >diaposonStarts - 1 && array[i] < diaposonEnds + 1) < count++; >> int finalArray[] = new int[count]; for (int i = 0; i < array.length; i++) < if (array[i] >diaposonStarts - 1 && array[i] < diaposonEnds + 1) < int s = 0; s = array[i]; for (int j = 0; j < finalArray.length; j++) < finalArray[j] = s; >System.out.println(s); > > System.out.println(Arrays.toString(finalArray)); return finalArray; > 

Как скопировать массив в Java

Методы, описанные ниже, применимы только к одномерным массивам. Прежде чем мы поговорим о различных способах копирования массива в Java, мы покажем вам, как НЕ копировать массив.

Как НЕ копировать массив в Java

Массивы в Java являются объектами. Если вы попытаетесь обработать их как переменные … ну, вы можете (!), Но то, что вы действительно копируете, это ссылка! , Пример ниже объясняет это утверждение.

 package com.csharpcoderr.copyarray; import java.util.Arrays; public class HowNOTtoCopyAnArray < public static void main(String[] args)< int[] x = ; int[] y = x; // не копировать массив так! System.out.println(Arrays.toString(x)); System.out.println(Arrays.toString(y)+"n"); x[1] = 22; // у [1] будет отображаться 22! та же ссылка System.out.println(Arrays.toString(x)); System.out.println(Arrays.toString(y)+"n"); y[4] = 55; // x [4] отобразит 55! System.out.println(Arrays.toString(x)); System.out.println(Arrays.toString(y)); > > 
 [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] [1, 22, 3, 4, 5] [1, 22, 3, 4, 5] [1, 22, 3, 4, 55] [1, 22, 3, 4, 55] 

1. Object.clone ()

Arrays наследовать методы от Object класс и clone это один из них. Если вам нужно скопировать массив как есть, то этот метод вам следует использовать.

 package com.csharpcoderr.copyarray; import java.util.Arrays; public class CloneArray < public static void main(String[] args)< int[] x = ; int[] y = x.clone(); System.out.println(Arrays.toString(x)); System.out.println(Arrays.toString(y)+"n"); x[1] = 22; System.out.println(Arrays.toString(x)); System.out.println(Arrays.toString(y)+"n"); y[4] = 55; System.out.println(Arrays.toString(x)); System.out.println(Arrays.toString(y)); > > 
 [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] [1, 22, 3, 4, 5] [1, 2, 3, 4, 5] [1, 22, 3, 4, 5] [1, 2, 3, 4, 55] 

2. Arrays.copyOf ()

В Arrays В классе есть два метода, которые копируют массив полностью или частично. Вот пример copyOf() метод.

 package com.csharpcoderr.copyarray; import java.util.Arrays; public class ArraysCopyOfMethod < public static void main(String[] args)< String[] x = ; String[] y = Arrays.copyOf(x, x.length); String[] z = Arrays.copyOf(x, 3); // скопируем 3 первых элемента массива x System.out.println("Array x: " + Arrays.toString(x)); System.out.println("Array y: " + Arrays.toString(y)); System.out.println("Array z: " + Arrays.toString(z)); > > 
 Array x: [one, two, three, four, five] Array y: [one, two, three, four, five] Array z: [one, two, three] 

3. Arrays.copyOfRange ()

И это пример метода copyOfRange ().

ЧИТАТЬ ТАКЖЕ: Пример статического ключевого слова Java

 package com.csharpcoderr.copyarray; import java.util.Arrays; public class ArraysCopyOfRangeMethod < public static void main(String[] args)< String[] x = ; String[] y = Arrays.copyOfRange(x, 0, x.length); // полная копия массива String[] z = Arrays.copyOfRange(x, x.length-2, x.length); // копируем только последние 2 элемента System.out.println("Array x: " + Arrays.toString(x)); System.out.println("Array y: " + Arrays.toString(y)); System.out.println("Array z: " + Arrays.toString(z)); > > 
 Array x: [one, two, three, four, five] Array y: [one, two, three, four, five] Array z: [four, five] 

4. System.arraycopy ()

С System.arraycopy() вы можете контролировать диапазон элементов из исходного массива, который вы хотите скопировать,
и предназначенная позиция.

Обзор System.arraycopy подпись ( JavaDoc ):

 arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 
 package com.csharpcoderr.copyarray; import java.util.Arrays; public class SystemArrayCopy < public static void main(String[] args)< String[] x = ; String[] y = new String[2]; System.arraycopy(x, 3, y, 0, 2); System.out.println("Array x: " + Arrays.toString(x)); System.out.println("Array y: " + Arrays.toString(y) + "n"); Object[] z = new Object[5]; System.arraycopy(x, 0, z, 0, 5); System.out.println("Array z: " + Arrays.toString(z)+"n"); Integer[] w = ; System.out.println("Array w: " + Arrays.toString(w)); // копируем из второго значения (1) массива w в z и помещаем в четвертое место (3) 2 значения System.arraycopy(w, 1, z, 3, 2); System.out.println("Array z: " + Arrays.toString(z)); > > 
 Array x: [one, two, three, four, five] Array y: [four, five] Array z: [one, two, three, four, five] Array w: [3, 4, 5] Array z: [one, two, three, 4, 5] 

Заметка
Не забудьте окружить ваш код попыткой catch для обработки исключений

Рекомендации

  1. Массивы JavaDoc
  2. Система JavaDoc
  3. Как скопировать массивы в Java

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *