Kwert-soft.ru

IT Софт для ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Array clone java

Копирование массива в Java

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

Метод 1 (простой, но неправильный)
У нас может возникнуть соблазн поступить так:

// Создать массив b [] того же размера, что и []

int b[] = new int [a.length];

// Не копирует элементы a [] в b [], только делает
// б ссылаются на то же место
b = a;

Однако это неверно!
Когда мы делаем «b = a», мы фактически присваиваем ссылку на массив. Следовательно, если мы внесем какое-либо изменение в один массив, оно будет отражено и в другом массиве, потому что и a, и b ссылаются на одно и то же местоположение.

// Java-программа, демонстрирующая простое назначение одного массива
// ссылка неверна.

public class Test

public static void main(String[] args)

// Создать массив b [] того же размера, что и []

int b[] = new int [a.length];

// Не копирует элементы a [] в b [], только делает

// б ссылаются на то же место

// Изменение на b [] также отразится в a [] как ‘a’ и

// ‘b’ ссылаются на то же место.

System.out.println( «Contents of a[] » );

for ( int i= 0 ; i

System.out.println( «nnContents of b[] » );

for ( int i= 0 ; i

Способ 2: (легко и правильно)
Мы могли бы выполнять итерацию каждого элемента данного исходного массива и копировать по одному элементу за раз. Использование этого метода гарантирует, что любые изменения в b не изменят исходный массив a.

// Java-программа для демонстрации копирования по одному
// присваиваем элементы a [] b [].

public class Test

public static void main(String[] args)

// Создать массив b [] того же размера, что и []

int b[] = new int [a.length];

// Копировать элементы из a [] в b []

for ( int i= 0 ; i

// Изменить b [], чтобы убедиться, что b [] отличается

System.out.println( «Contents of a[] » );

for ( int i= 0 ; i

System.out.println( «nnContents of b[] » );

for ( int i= 0 ; i

Способ 3: (с использованием Clone ())
В предыдущем методе нам пришлось перебирать весь массив, чтобы сделать копию, можем ли мы сделать лучше? Ответ ДА!

// Java-программа для демонстрации копирования массива с использованием clone ()

public class Test

public static void main(String[] args)

// Копировать элементы из a [] в b []

// Изменить b [], чтобы убедиться, что b [] отличается

System.out.println( «Contents of a[] » );

for ( int i= 0 ; i

System.out.println( «nnContents of b[] » );

for ( int i= 0 ; i

Метод 4: (Использование System.arraycopy ())
Мы также можем использовать метод System.arraycopy () . Система присутствует в пакете java.lang. Его подпись такова:

Где src обозначает исходный массив, srcPos — это индекс, с которого начинается копирование. Аналогично, dest обозначает массив назначения, destPos — это индекс, из которого скопированные элементы помещаются в массив назначения. длина — длина копируемого массива. Программа ниже иллюстрирует то же самое:

// Java-программа для демонстрации копирования массива с использованием
// System.arraycopy ()

public class Test

public static void main(String[] args)

// Создать массив b [] того же размера, что и []

int b[] = new int [a.length];

// Копировать элементы из a [] в b []

System.arraycopy(a, 0 , b, 0 , 3 );

// Изменить b [], чтобы убедиться, что b [] отличается

System.out.println( «Contents of a[] » );

for ( int i= 0 ; i

System.out.println( «nnContents of b[] » );

for ( int i= 0 ; i

Обзор вышеуказанных методов:

  • Просто присвоить ссылку неправильно
  • Массив можно копировать, перебирая массив, и один за другим присваивая элементы.
  • Мы можем избежать итерации по элементам, используя clone () или System.arraycopy ()
  • clone () создает новый массив того же размера, но System.arraycopy () может использоваться для копирования из исходного диапазона в целевой диапазон.
  • System.arraycopy () работает быстрее, чем clone (), поскольку использует собственный интерфейс Java (источник: StackOverflow )

Эта статья предоставлена Ашутошем Кумаром . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

How to Copy an Array in Java

Last modified: February 12, 2020

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

In the 9 years of running Baeldung, I’ve never, ever done a «sale».
But. we’ve also not been through anything like this pandemic either.
And, if making my courses more affordable for a while is going to help a company stay in business, or a developer land a new job, make rent or be able to provide for their family — then it’s well worth doing.
Effective immediately, all Baeldung courses are 33% off their normal prices!
You’ll find all three courses in the menu, above, or here.

1. Overview

In this quick article, we’ll discuss different array copying methods in Java. Array copy may seem like a trivial task, but it may cause unexpected results and program behaviors if not done carefully.

2. The System >

Let’s start with the core Java library – System.arrayCopy(); this copies an array from a source array to a destination array, starting the copy action from the source position to the target position till the specified length.

The number of elements copied to the target array equals the specified length. It provides an easy way to copy a sub-sequence of an array to another.

If any of the array arguments is null, it throws a NullPointerException and if any of the integer arguments is negative or out of range, it throws an IndexOutOfBoundException.

Let’s have a look at an example to copy a full array to another using the java.util.System class:

Arguments this method take are; a source array, the starting position to copy from source array, a destination array, the starting position in the destination array, and the number of elements to be copied.

Let’s have a look at another example that shows copying a sub-sequence from a source array to a destination:

3. The Arrays >

The Arrays class also offers multiple overloaded methods to copy an array to another. Internally, it uses the same approach provided by System class that we have seen earlier. It mainly provides two methods, copyOf(…) and copyRangeOf(…).

Let’s have a look at copyOf first:

It’s important to note that Arrays class uses Math.min(…) for selecting the minimum of the source array length and the value of the new length parameter to determine the size of the resulting array.

Arrays.copyOfRange() takes 2 parameters, ‘from’ and ‘to’ in addition to the source array parameter. The resulting array includes the ‘from’ index but the ‘to’ index is excluded. Let’s see an example:

Both of these methods do a shallow copy of objects if applied on an array of non-primitive object types. Let’s see an example test case:

Because the result is a shallow copy – a change in the employee name of an element of the original array caused the change in the copy array.

And so – if we want to do a deep copy of non-primitive types – we can go for the other options described in the upcoming sections.

4. Array Copy With Object.clone()

Object.clone() is inherited from Object class in an array.

Let’s first copy an array of primitive types using clone method:

And a proof that it works:

The above example shows that have the same content after cloning but they hold different references, so any change in any of them won’t affect the other one.

On the other hand, if we clone an array of non-primitive types using the same method, then the results will be different.

It creates a shallow copy of the non-primitive type array elements, even if the enclosed object’s class implements the Cloneable interface and overrides the clone() method from the Object class.

Let’s have a look at an example:

We can test our implementation by creating a new array of addresses and invoking our clone() method:

This example shows that any change in the original or copied array would cause the change in the other one even when the enclosed objects are Cloneable.

5. Using the Stream API

It turns out, we can use the Stream API for copying arrays too. Let’s have a look at an example:

For the non-primitive types, it will also do a shallow copy of objects. To learn more about Java 8 Streams, you can start here.

6. External Libraries

Apache Commons 3 offers a utility class called SerializationUtils that provides a clone(…) method. It is very useful if we need to do a deep copy of an array of non-primitive types. It can be downloaded from here and its Maven dependency is:

Let’s have a look at a test case:

This class requires that each object should implement the Serializable interface. In terms of performance, it is slower than the clone methods written manually for each of the objects in our object graph to copy.

7. Conclusion

In this tutorial, we had a look at the various options to copy an array in Java.

The method to use is mainly dependent upon the exact scenario. As long as we’re using a primitive type array, we can use any of the methods offered by the System and Arrays classes. There shouldn’t be any difference in performance.

For non-primitive types, if we need to do a deep copy of an array we can either use the SerializationUtils or add clone methods to our classes explicitly.

And as always, the examples shown in this article are available on over on GitHub.

Java Copy Array: How To Copy / Clone An Array In Java

This Tutorial on Copying and Cloning of Arrays Discusses the Various Methods to Copy an Array in Java:

Here we will discuss the copy operation of Java arrays. Java provides various ways in which you can make copies of array elements. As we know, in Java, arrays can contain elements either of primitive types or objects or references.

While making copies of primitive types, the task is rather easy but when it comes to objects or references, you need to pay attention as to whether the copy is deep or shallow.

Shallow copy makes a copy of the element. It is not a problem when primitive data types are involved. But when references are involved, a shallow copy will just copy the value and not the underlying information.

Thus, even though you have made copies of elements, a change in one copy will reflect in other copy too as the memory locations are shared. To prevent this, you need to go for a deep copy in which the memory locations are not shared.

What You Will Learn:

Copy And Clone Java Arrays

Java allows you to copy arrays using either direct copy method provided by java.util or System class. It also provides a clone method that is used to clone an entire array.

In this tutorial, we will discuss the following methods of Copying and Cloning Arrays.

  • Manual copying using for loop
  • Using System.arraycopy()
  • Using Arrays.copyOf()
  • Using Arrays.copyOfRange()
  • Using Object.clone()

Let’s Explore!!

Manual Copying Using For Loop

Normally when we copy variables, for example, a and b, we perform the copy operation as follows:

a=b;

It is not going to work correctly if we apply the same method to arrays.

Let’s see a programming example.

Output:

In the above program, there are two arrays i.e. intArray and copyArray. The task is to copy the contents of the intArray to copyArray. To do this, the statement copyArray = intArray is introduced. What is done here is the references of the array are assigned. Hence this is not actual copying.

As a result of the above statement, the memory location of the intArray is shared by the copyArray as well. Now when the copyArray element is incremented, that change is reflected in the intArray too. This is shown in the output.

To overcome this problem, we employ a method of copying the array using for loop. Here, each element of the original array is copied to the new array using a for loop.

This program is shown below.

Output:

Here we have modified the previous program to include for loop and inside for loop, we assign each element of intArray to the corresponding element of copyArray. This way, the elements are actually copied. So when one array is modified, the changes do not reflect in another array.

Using System.arraycopy()

Java’s System class has a method called “ArrayCOpy” that allows you to copy elements of one array to another array.

The general prototype of this method is as follows:

  • src_array => Source array from where the contents are to be copied.
  • src_Pos => The position in the source array from where copying will start.
  • dest_array => Destination array to which elements are to be copied.
  • dest_Pos => Starting position in the destination array for the elements to be copied.
  • length => Length of the array to be copied.

Let’s understand this method with an example.

Output:

In the above program, we use the ‘arraycopy’ method to copy an array to another array. You can see the call to the arraycopy method. We copy the source array from the beginning (0 th location) and copy the entire array.

Lastly, we display the string equivalent of both the source as well as destination arrays.

With the arraycopy method, you can copy even partial arrays as it takes the start and end element positions as arguments. This method makes a shallow copy of array elements.

Using Arrays.copyOf()

The method Arrays.copyOf() internally makes use of the System.arraycopy () method. Though it is not as efficient as arraycopy, it can be used to copy full or partial array just like the arraycopy method.

‘copyOf()’ method is a part of the java.util package and belongs to the “Arrays” class.

The prototype of this method is as follows:

  • original: The array to be copied to the new array.
  • newLength: The length of the copied array to be returned.

Thus, this method makes a copy of the array provided in the first argument to the specified length by truncating or padding the length with 0 to the new array. This means if the length of the copied array is more than the original array, 0s are replaced for the remaining elements.

The program given below shows an example of the copyOf method.

Output:

In the above program, we copy the even_Array of length 4 by using the copyOf method. The second argument provided is 5. Hence, the new copied array has 5 elements in it. The first four are the same as the original array and the fifth element is 0 as copyOf pads it because the length of the original array is less than that of the new array.

Using Arrays.copyOfRange()

The method Arrays.copyOfRange() is specifically used when you want to copy partial arrays. Like copyOf() method, this method also internally makes use of System.arraycopy() method.

The prototype of Arrays.copyOfRange() method is as follows:

  • original: The array from which a range is to be copied.
  • from: Initial index of the range to be copied, inclusive.
  • to: The final index of the range to be copied, exclusive.

An example implementation of the copyOfRange method is shown below.

Output:

Using Object.clone()

Java array internally implements a Cloneable interface and thus it is easy to clone a Java array. You can clone one-dimensional as well as two-dimensional arrays. When you clone one-dimensional array, it makes a deep copy of array elements which is copying the values.

On the other hand, when you clone two dimensional or multi-dimensional arrays, a shallow copy of elements is made i.e. only references are copied. This cloning of arrays is done by the ‘Clone ()’ method provided by the arrays.

A deep copy of 1-D arrays as a result of cloning can be represented as below:

Now let’s implement the 1-D array cloning in a Java program.

Output:

As you can see in the output, the expression to check for equality of both the arrays returns false. This is because the cloning of one-dimensional array results in deep copy wherein the values are copied to a new array and not merely references.

Frequently Asked Questions

Q #1) How to make a copy of an array in Java?

Answer: There are different methods to copy an array.

  • You can use a for loop and copy elements of one to another one by one.
  • Use the clone method to clone an array.
  • Use arraycopy() method of System class.
  • Use copyOf() or copyOfRange() methods of Arrays class.

Q #2) How do you assign one array to another?

Answer: You can assign the array to another using a simple assignment operator (=). You have to ensure that the two arrays are of the same data type and have an identical dimension.

Q #3) What is a Shallow copy and Deep copy?

Answer: In shallow copy, only the attributes of objects or arrays in question are copied. So any changes to the copied array will reflect in the original. Java cloning is an example of a shallow copy.

A deep copy is the one wherein we need a complete copy of the object so that when we clone or copy that object, it is an independent copy. When primitive or built-in types are involved, there is no difference between the shallow and deep copy.

Q #4) What does an Array Clone do?

Answer: The cloning method of arrays is used to copy the attributes of one object to another. It uses a shallow copy for doing this.

Q #5) Can you store an Array in an Array?

Answer: Arrays can contain arrays provided with the elements that are of the same type (primitive or object). This means you cannot store an integer array in a string array.

Conclusion

In this tutorial, we explored copy array and clone arrays in Java. We have seen various methods/approaches to copy and clone an array.

Note that most of these methods implement a shallow copy. For primitive data types, shallow and deep copy does not differ. But when an array contains objects or references, the programmer needs to implement a deep copy as per the requirements.

In our subsequent tutorials, we continue to explore more about Java arrays.

Массивы в Java — определение и создание, инициализация и заполнение

Массив — это структура данных, которая предназначена для хранения однотипных данных. Массивы в Java работают иначе, чем в C/C++. Особенности:

  • Поскольку массивы являются объектами, мы можем найти их длину. Это отличается от C/C++, где мы находим длину с помощью sizeof.
  • Переменная массива может также быть объявлена как другие переменные.
  • Переменные упорядочены и имеют индекс, начинающийся с 0.
  • Может также использоваться как статическое поле, локальная переменная или параметр метода.
  • Размер массива должен быть задан значением int, а не long или short.
  • Прямым суперклассом типа массива является Object.
  • Каждый тип массива реализует интерфейсы Cloneable and java.io.Serializable.

Может содержать как простые типы данных, так и объекты класса в зависимости от определения.

В этой статье вы узнаете

Инициализация и доступ к массиву

Одномерные Массивы: общая форма объявления

Объявление состоит из двух компонентов: типа и имени. type объявляет тип элемента массива. Тип элемента определяет тип данных каждого элемента.

Кроме типа int, мы также можем создать массив других типов данных, таких как char, float, double или определяемый пользователем тип данных (объекты класса).Таким образом, тип элемента определяет, какой тип данных будет храниться в массиве. Например:

Хотя приведенное выше первое объявление устанавливает тот факт, что intArray является переменной массива, массив фактически не существует. Он просто говорит компилятору, что эта переменная типа integer.

Чтобы связать массив int с фактическим физическим массивом целых чисел, необходимо обозначить его с помощью new и назначить int.

Как создать массив в Java

При объявлении массива создается только ссылка на массив. Чтобы фактически создать или предоставить память массиву, надо создать массив следующим образом: общая форма new применительно к одномерным и выглядит следующим образом:
var-name = new type [size];

Здесь type указывает тип данных, size — количество элементов в массиве, а var-name-имя переменной массива.

Важно знать, что элементы массива, выделенные функцией new, автоматически инициализируются нулем (для числовых типов), ложью (для логических типов) или нулем (для ссылочных типов).
Получение массива — это двухэтапный процесс. Во-первых, необходимо объявить переменную нужного типа. Во-вторых, необходимо выделить память, которая будет содержать массив, с помощью new, и назначить ее переменной. Таким образом, в Java все массивы выделяются динамически.

Литералы массива

В ситуации, когда размер массива и переменные уже известны, можно использовать литералы.

  • Длина этого массива определяет длину созданного массива.
  • Нет необходимости писать int[] в последних версиях Java

Доступ к элементам массива Java с помощью цикла for

Доступ к каждому элементу массива осуществляется через его индекс. Индекс начинается с 0 и заканчивается на (общий размер)-1. Все элементы могут быть доступны с помощью цикла for.

// Пример для иллюстрации создания array
// целых чисел, помещает некоторые значения в массив,
// и выводит каждое значение.

class GFG
<
public static void main (String[] args)
<
// declares an Array of integers.
int[] arr;

// allocating memory for 5 integers.
arr = new int[5];

// initialize the first elements of the array
arr[0] = 10;

// initialize the second elements of the array
arr[1] = 20;

//so on…
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;

// accessing the elements of the specified array
for (int i = 0; i  

Массивы объектов

Массив объектов создается так же, как элементов данных следующим образом:

StudentArray содержит семь элементов памяти каждый из класса student, в котором адреса семи объектов Student могут быть сохранены. Student объекты должны быть созданы с помощью конструктора класса student и их ссылки должны быть присвоены элементам массива следующим образом:

// Java program to illustrate creating an array of
// objects

class Student
<
public int roll_no;
public String name;
Student(int roll_no, String name)
<
this.roll_no = roll_no;
this.name = name;
>
>

// Elements of array are objects of a class Student.
public class GFG
<
public static void main (String[] args)
<
// declares an Array of integers.
Student[] arr;

// allocating memory for 5 objects of type Student.
arr = new Student[5];

// initialize the first elements of the array
arr[0] = new Student(1,»aman»);

// initialize the second elements of the array
arr[1] = new Student(2,»vaibhav»);

// so on…
arr[2] = new Student(3,»shikar»);
arr[3] = new Student(4,»dharmesh»);
arr[4] = new Student(5,»mohit»);

// accessing the elements of the specified array
for (int i = 0; i

Многомерные

Многомерные массивы — это массивы массивов, каждый элемент которых содержит ссылку на другой массив. Создается путем добавления одного набора квадратных скобок ([]) для каждого измерения. Рассмотрим пример:

class multiDimensional
<
public static void main(String args[])
<
// declaring and initializing 2D array
int arr[][] = < <2,7,9>,<3,6,1>, <7,4,2>>;

// printing 2D array
for (int i=0; i 

Передача массивов в метод

Как и переменные, мы можем передавать массивы в методы.

На выходе получим:

sum of array values : 15

Возврат массивов из методов

Как обычно, метод также может возвращать массив. Например, ниже программа возвращает массив из метода m1.

Объекты класса

Каждый массив имеет связанный объект класса, совместно используемый со всеми другими массивами с тем же типом компонента.

class [I
class java.lang.Object
class [B
class [S
class [Ljava.lang.String;

Теперь, как вы знаете, что массивы являются объектом класса. Членами массива являются следующие элементы:

  • Конечная длина открытого поля, содержащего количество компонентов. Длина может быть положительной или нулевой.
  • Все члены наследуются от класса Object; единственный метод объекта, который не наследуется, является метод clone.
  • Открытый метод clone () переопределяет метод clone в объекте класса.

Клонирование массивов

При клонировании одномерного массива, например Object[], выполняется копия с новым массивом, содержащим копии элементов исходного, а не ссылки.

Клон многомерного массива (например, Object [] []) является копией и это означает, что он создает только один новый массив с каждым элементом и ссылкой на исходный массив элементов, но вложенные массивы являются общими.

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Читать еще:  Не запускается windows 10 после восстановления системы
Ссылка на основную публикацию
Adblock
detector