Как скопировать массив?
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 ; результат: Copied successfully: [1, 2, 3, 4, 5] Приведенный выше код эквивалентен: // Общий метод для копирования массива объектов из `source[]` в `dest[]` Мы знаем, что массивы — это объекты в Java, и все методы класса Object класс может быть вызван для массива. Object класс имеет clone() метод для копирования объектов в Java, а поскольку массивы рассматриваются как объекты, мы можем использовать этот метод и для копирования массивов. import java . util . Arrays ; результат: Copied successfully: [1, 2, 3, 4, 5] Обратите внимание, что Object.clone() метод создает мелкая копия массива, т. е. новый массив может ссылаться на те же элементы, что и исходный массив. Для иллюстрации рассмотрим следующий пример: import java . util . Arrays ; результат: Shallow copy Arrays.copyOf() также может использоваться для копирования указанного массива в новый массив, как показано ниже. Если указанный массив содержит какие-либо ссылочные элементы, этот метод также выполняет поверхностное копирование. // Метод для копирования массива объектов в Java Arrays.copyOf() имеет перегруженная версия где мы можем указать Type полученного массива. // исходный массив Arrays также обеспечивает copyOfRange() метод, аналогичный copyOf() но только копирует элементы между указанным диапазоном в новый массив. // Метод для копирования массива объектов в Java Похожий на Arrays.copyOf() , создается поверхностная копия исходного массива, а также у него есть перегруженная версия, в которой мы можем указать Type полученного массива. Мы видели, что во всех рассмотренных выше подходах создается поверхностная копия массива, но это то, чего нам может не хотеться. Одним из простых решений этой проблемы является Serialization. Для иллюстрации следующий код возвращает глубокую копию массива путем сериализации массива с помощью библиотеки Google Gson. Помогите исправить метод. Цель метода: скопировать в новый массив все значения, которые входят в диапазон. Метод принимает заранее созданный массив, начало диапазона и конец диапазона, но возвращает метод массив заполненный только одним числом, которое входит в диапазон. Теоретически это должно выглядеть так: пользователь ввел 40 и 80, результат: А практически выходит: пользователь ввел 40 и 80, результат: Методы, описанные ниже, применимы только к одномерным массивам. Прежде чем мы поговорим о различных способах копирования массива в Java, мы покажем вам, как НЕ копировать массив. Массивы в Java являются объектами. Если вы попытаетесь обработать их как переменные … ну, вы можете (!), Но то, что вы действительно копируете, это ссылка! , Пример ниже объясняет это утверждение. Arrays наследовать методы от Object класс и clone это один из них. Если вам нужно скопировать массив как есть, то этот метод вам следует использовать. В Arrays В классе есть два метода, которые копируют массив полностью или частично. Вот пример copyOf() метод. И это пример метода copyOfRange (). ЧИТАТЬ ТАКЖЕ: Пример статического ключевого слова Java С System.arraycopy() вы можете контролировать диапазон элементов из исходного массива, который вы хотите скопировать, Обзор System.arraycopy подпись ( JavaDoc ): Заметка
class Main
// Общий метод для копирования массива объектов из `source[]` в `dest[]`
private static
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 ) ) ;
private static
for ( int i = 0 ; i < source . length ; i ++ ) <
dest [ i ] = source [ i ] ;
2. Использование Object.clone() метод
class Main
// Метод для копирования массива объектов в Java
private static
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 ) ) ;
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" ) ;
3. Использование Arrays.copyOf() метод
private static
return Arrays . copyOf ( source , source . length ) ;
Number [ ] source = < 1 , 2 , 3 , 4 , 5 >;
// получаем `Integer[]` из `Number[]`
Integer [ ] dest = Arrays . copyOf ( source , source . length , Integer [ ] . class ) ;4. Использование Arrays.copyOfRange() метод
private static
return Arrays . copyOfRange ( source , 0 , source . length ) ;5. Сериализация массива объектов с помощью GSON
Копирование значений одного массива в другой
массив 1 = (34, 10, 56, 79, 0, 48)
2 массив = (56, 79, 48)
массив 1 = (34, 10, 56, 79, 0, 48)
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
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 ()
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 ()
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 ()
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 ()
и предназначенная позиция.
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 для обработки исключенийРекомендации