copy-array-java

Copy Array – Array Copy trong Java

Hôm nay chúng ta sẽ tìm hiểu các cách khác nhau để sao chép mảng Java. Java cung cấp các phương thức sẵn có để sao chép mảng. Cho dù bạn muốn sao chép toàn bộ hay sao chép một phần của mảng, bạn có thể thực hiện dễ dàng bằng cách sử dụng các lớp có sẵn của Java.

LUYỆN THI CHỨNG CHỈ OCA

Copy Array trong Java

Có nhiều cách để sao chép mảng trong Java. Hãy xem xét từng cái một.

  • Object.clone(): Lớp đối tượng cung cấp phương thức clone() và vì mảng trong java cũng là một Object, bạn có thể sử dụng phương thức này để copy bản sao toàn bộ mảng. Phương pháp này sẽ không phù hợp với bạn nếu bạn muốn sao chép một phần của mảng.
  • System.arraycopy(): System.arraycopy() là cách tốt nhất để sao chép một phần của một mảng. Nó cung cấp cho bạn một cách dễ dàng để chỉ định tổng số phần tử để sao chép và vị trí chỉ số mảng nguồn và đích. Ví dụ: System.arraycopy(source, 3, destination, 2, 5) sẽ sao chép 5 phần tử từ nguồn đến đích, bắt đầu từ chỉ mục thứ 3 của nguồn đến chỉ mục thứ 2 của đích.
  • Arrays.copyOf(): Nếu bạn muốn sao chép một số phần tử đầu tiên của một mảng hoặc bản sao đầy đủ của mảng, bạn có thể sử dụng phương pháp này. Rõ ràng là nó không linh hoạt như vậy System.arraycopy() nhưng nó cũng không khó hiểu và dễ sử dụng. Phương thức này sử dụng nội bộ phương thức System.arrayy().
  • Arrays.copyOfRange(): Nếu bạn muốn sao chép một số phần tử của mảng, trong đó chỉ mục bắt đầu không phải là 0, bạn có thể sử dụng phương pháp này để sao chép một phần mảng. Một lần nữa, phương pháp này cũng đang sử dụng chính phương thức Hệ thống sắp xếp.

Vì vậy, đây là bốn phương pháp hữu ích nhất để sao chép toàn bộ và một phần mảng. Lưu ý rằng tất cả các phương thức có sẵn này chỉ để sao chép mảng một chiều.

Ví dụ về mảng sao chép trong Java

Bây giờ chúng ta hãy xem các phương thức sao chép mảng java này hoạt động với một chương trình java đơn giản.


import java.util.Arrays;

public class JavaArrayExample {

    /**
     * This class shows different methods for copy array in java
     * @param args
     */
    public static void main(String[] args) {
        int[] source = {1,2,3,4,5,6,7,8,9};
        int[] source1 = {1,2,3};
        int[] destination=null;
        System.out.println("Source array = "+Arrays.toString(source));
        
        destination = copyFirstFiveFieldsOfArrayUsingSystem(source);
        System.out.println(" First five elements of array if available. Result array = "+Arrays.toString(destination));
        
        destination = copyFirstFiveFieldsOfArrayUsingSystem(source1);
        System.out.println(" First five elements of array if available. Result array = "+Arrays.toString(destination));
        
        destination = copyFullArrayUsingSystem(source);
        System.out.println(" full array using System.copyarray() function. Result array = "+Arrays.toString(destination));
        
        destination = copyFullArrayUsingClone(source);
        System.out.println(" full array using clone() function. Result array = "+Arrays.toString(destination));
        
        destination = copyFullArrayUsingArrayOf(source);
        System.out.println(" full array using Arrays.copyOf() function. Result array = "+Arrays.toString(destination));
        
        destination = copyLastThreeUsingArrayOfRange(source);
        System.out.println(" last three elements using Arrays.copyOfRange() function. Result array = "+Arrays.toString(destination));
    }

    /**
     * This method copy full array using Arrays.copyOf() function
     * @param source
     * @return
     */
    private static int[] copyFullArrayUsingArrayOf(int[] source) {
        return Arrays.copyOf(source, source.length);
    }
    
    /**
     * This method copy partial array (last 3 elements) using 
     * Arrays.copyOfRange() function
     * @param source
     * @return
     */
    private static int[] copyLastThreeUsingArrayOfRange(int[] source) {
        //length check is necessary to avoid java.lang.ArrayIndexOutOfBoundsException
        //but for simplicity I am not doing that
        return Arrays.copyOfRange(source, source.length-3, source.length);
    }

    /**
     * This method copy full array using clone() function
     * @param source
     * @return
     */
    private static int[] copyFullArrayUsingClone(int[] source) {
        return source.clone();
    }

    /**
     * This method copy full array using System.arraycopy() function
     * @param source
     * @return
     */
    private static int[] copyFullArrayUsingSystem(int[] source) {
        int[] temp=new int[source.length];
        System.arraycopy(source, 0, temp, 0, source.length);
        return temp;
    }

    /**
     * This method copy full first five elements of array 
     * using System.arraycopy() function
     * @param source
     * @return
     */
    private static int[] copyFirstFiveFieldsOfArrayUsingSystem(int[] source) {
        if(source.length > 5){
            int[] temp=new int[5];
            System.arraycopy(source, 0, temp, 0, 5);
            return temp;
        }else{
            int[] temp=new int[source.length];
            System.arraycopy(source, 0, temp, 0, source.length);
            return temp;
        }
        
    }

}
Code language: PHP (php)

Output:


Source array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 First five elements of array if available. Result array = [1, 2, 3, 4, 5]
 First five elements of array if available. Result array = [1, 2, 3]
 full array using System.copyarray() function. Result array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 full array using clone() function. Result array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 full array using Arrays.copyOf() function. Result array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 last three elements using Arrays.copyOfRange() function. Result array = [7, 8, 9]

Array Copy – Shallow Copy

Lưu ý rằng tất cả các phương thức có sẵn được thảo luận ở trên cho bản sao mảng đều thực hiện sao chép nông, vì vậy chúng tốt cho các kiểu dữ liệu nguyên thủy và các đối tượng bất biến như String. Nếu bạn muốn sao chép một mảng các đối tượng có thể thay đổi, bạn nên thực hiện bằng cách tự viết mã cho một bản sao deep. Dưới đây là một chương trình hiển thị sự cố với các phương pháp sao chép Shallow.


import java.util.Arrays;

public class JavaArrayMutableObjects {

	public static void main(String[] args) {
		Employee e = new Employee("Pankaj");
		
		Employee[] empArray1 = {e};
		
		Employee[] empArray2 = new Employee[empArray1.length];
				
		System.arraycopy(empArray1, 0, empArray2, 0, empArray1.length);
		
		System.out.println("empArray1 = "+Arrays.toString(empArray1));
		System.out.println("empArray2 = "+Arrays.toString(empArray2));
		
		//Let's change empArray1
		empArray1[0].setName("David");
		
		System.out.println("empArray1 = "+Arrays.toString(empArray1));
		System.out.println("empArray2 = "+Arrays.toString(empArray2));
		
	}

}

class Employee {
	private String name;

	public Employee(String n) {
		this.name = n;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return this.name;
	}
}
Code language: JavaScript (javascript)
empArray1 = [Pankaj]
empArray2 = [Pankaj]
empArray1 = [David]
empArray2 = [David]

Như bạn có thể thấy, emArray2 cũngđã thay đổi mặc dù nó không bao giờ là dự định. Điều này có thể gây ra các vấn đề nghiêm trọng trong ứng dụng của bạn, vì vậy bạn nên viết mã của riêng mình để sao chép deep mảng. Trường hợp tương tự cũng có đối với phương thức sao chép đối tượng java .

Ví dụ


import java.util.Arrays;

public class JavaArrayMutableObjects {

	public static void main(String[] args) {
		Employee e = new Employee("Pankaj");
		
		Employee[] empArray1 = {e};
		
		Employee[] empArray2 = full(empArray1);
		
		System.out.println("empArray1 = "+Arrays.toString(empArray1));
		System.out.println("empArray2 = "+Arrays.toString(empArray2));
		
		//Let's change empArray1
		empArray1[0].setName("David");
		
		System.out.println("empArray1 = "+Arrays.toString(empArray1));
		System.out.println("empArray2 = "+Arrays.toString(empArray2));

		
	}

	private static Employee[] full(Employee[] source) {
		Employee[] destination = new Employee[source.length];
		
		for(int i=0; i< source.length; i++) {
			Employee e = source[i];
			Employee temp = new Employee(e.getName());
			destination[i] = temp;
		}
		return destination;
	}

}

class Employee {
	private String name;

	public Employee(String n) {
		this.name = n;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return this.name;
	}
}
Code language: JavaScript (javascript)

Output:

empArray1 = [Pankaj]
empArray2 = [Pankaj]
empArray1 = [David]
empArray2 = [Pankaj]

Như bạn có thể thấy, trong bản sao deep các phần tử mảng nguồn và đích của chúng ta đang tham chiếu đến các đối tượng khác nhau. Vì vậy, chúng hoàn toàn tách rời và nếu chúng ta thay đổi một trong số chúng, thì cái còn lại sẽ không bị ảnh hưởng.

Trên đây là cách copy mảng trong Java, Happy learning!!!

HỌC JAVA CORE~

Bài viết liên quan

Leave a Reply

Your email address will not be published.

TÀI LIỆU DEV WORLD
Cẩm nang phát triển bền vững với nghề lập trình!