Sao chép mảng 1 chiều và 2 chiều

Trong hướng dẫn này, bạn sẽ tìm hiểu về các cách khác nhau mà bạn có thể sử dụng để sao chép mảng (cả một chiều và hai chiều) trong Java với sự trợ giúp của các ví dụ.

Trong Java, chúng ta có thể sao chép một mảng này vào một mảng khác. Có một số kỹ thuật bạn có thể sử dụng để sao chép mảng trong Java.

1. Sao chép mảng bằng toán tử gán

Hãy lấy một ví dụ,

class Main {
    public static void main(String[] args) {
       
        int [] numbers = {1, 2, 3, 4, 5, 6};
        int [] positiveNumbers = numbers;    // copying arrays

        for (int number: positiveNumbers) {
            System.out.print(number + ", ");
        }
    }
}

Đầu ra :

1, 2, 3, 4, 5, 6

Trong ví dụ trên, chúng ta đã sử dụng toán tử gán ( =) để sao chép một mảng có tên là các số sang một mảng khác có tên là Số dương .

Kỹ thuật này là kỹ thuật dễ nhất và nó hoạt động tốt. Tuy nhiên, có một vấn đề với kỹ thuật này. Nếu chúng ta thay đổi các phần tử của một mảng thì các phần tử tương ứng của các mảng khác cũng thay đổi theo. Ví dụ,

class Main {
    public static void main(String[] args) {
      
        int [] numbers = {1, 2, 3, 4, 5, 6};
        int [] positiveNumbers = numbers;    // copying arrays
      
        // change value of first array
        numbers[0] = -1;

        // printing the second array
        for (int number: positiveNumbers) {
            System.out.print(number + ", ");
        }
    }
}

Đầu ra :

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

Ở đây, chúng ta có thể thấy rằng chúng ta đã thay đổi một giá trị của mảng số . Khi chúng ta in mảng positiveNumbers , chúng ta có thể thấy rằng giá trị tương tự cũng bị thay đổi.

Đó là bởi vì cả hai mảng đều tham chiếu đến cùng một đối tượng mảng. Đây là do bản sao nông cạn. Để tìm hiểu thêm về bản sao cạn, hãy truy cập bản sao nông .

Bây giờ, để tạo các đối tượng mảng mới trong khi sao chép các mảng, chúng ta cần bản sao sâu hơn là bản sao cạn.

2. Sử dụng cấu trúc vòng lặp để sao chép mảng

Hãy lấy một ví dụ:

import java.util.Arrays;

class Main {
    public static void main(String[] args) {
      
        int [] source = {1, 2, 3, 4, 5, 6};
        int [] destination = new int[6];

        // iterate and copy elements from source to destination
        for (int i = 0; i < source.length; ++i) {
            destination[i] = source[i];
        }
      
         // converting array to string
        System.out.println(Arrays.toString(destination));
    }
}

Đầu ra :

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

Trong ví dụ trên, chúng ta đã sử dụng forvòng lặp để lặp qua từng phần tử của mảng nguồn. Trong mỗi lần lặp, chúng ta đang sao chép các phần tử từ mảng nguồn sang mảng đích .

Ở đây, mảng nguồn và đích tham chiếu đến các đối tượng khác nhau (bản sao sâu). Do đó, nếu các phần tử của một mảng bị thay đổi thì các phần tử tương ứng của mảng khác không thay đổi.

Lưu ý tuyên bố,

System.out.println(Arrays.toString(destination));

Ở đây, phương thức toString () được sử dụng để chuyển một mảng thành một chuỗi. Để tìm hiểu thêm, hãy truy cập phương thức toString () (tài liệu Java chính thức) .

3. Sao chép mảng bằng phương thức arrayycopy ()

Trong Java, lớp Hệ thống chứa một phương thức được đặt tên arraycopy()để sao chép mảng. Phương pháp này là một cách tiếp cận tốt hơn để sao chép mảng so với hai phương pháp trên.

Các arraycopy()phương pháp cho phép bạn sao chép một phần nhất định các mảng nguồn đến các mảng đích. Ví dụ,

arraycopy(Object codefly_src, int codefly_srcPos,Object dest, int destPos, int length)

Đây,

  • src – source array you want to copy
  • srcPos – starting position (index) in the source array
  • dest – destination array where elements will be copied from the source
  • destPos – starting position (index) in the destination array
  • length – number of elements to copy

Hãy lấy một ví dụ:

// To use Arrays.toString() method
import java.util.Arrays;

class Main {
    public static void main(String[] args) {
        int[] n1 = {2, 3, 12, 4, 12, -2};
      
        int[] n3 = new int[5];

        // Creating n2 array of having length of n1 array
        int[] n2 = new int[n1.length];
      
        // copying entire n1 array to n2
        System.arraycopy(n1, 0, n2, 0, n1.length);
        System.out.println("n2 = " + Arrays.toString(n2));  
      
        // copying elements from index 2 on n1 array
        // copying element to index 1 of n3 array
        // 2 elements will be copied
        System.arraycopy(n1, 2, n3, 1, 2);
        System.out.println("n3 = " + Arrays.toString(n3));  
    }
}

Đầu ra :

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

Trong ví dụ trên, chúng tôi đã sử dụng arraycopy()phương pháp,

  • System.arraycopy(n1, 0, n2, 0, n1.length) – entire elements from the n1 array are copied to n2 array
  • System.arraycopy(n1, 2, n3, 1, 2) – 2 elements of the n1 array starting from index 2 are copied to the index starting from 1 of the n3 array

Như bạn có thể thấy, giá trị ban đầu mặc định của các phần tử của mảng kiểu int là 0.

4. Sao chép mảng bằng phương thức copyOfRange ()

Chúng ta cũng có thể sử dụng phương thức copyOfRange () được định nghĩa trong lớp Java Arrays để sao chép mảng. Ví dụ,

// To use toString() and copyOfRange() method
import java.util.Arrays;

class ArraysCopy {
    public static void main(String[] args) {
      
        int[] source = {2, 3, 12, 4, 12, -2};
      
        // copying entire source array to destination
        int[] destination1 = Arrays.copyOfRange(source, 0, source.length);      
        System.out.println("destination1 = " + Arrays.toString(destination1)); 
      
        // copying from index 2 to 5 (5 is not included) 
        int[] destination2 = Arrays.copyOfRange(source, 2, 5); 
        System.out.println("destination2 = " + Arrays.toString(destination2));   
    }
}

Đầu ra

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

Trong ví dụ trên, hãy lưu ý dòng,

int[] destination1 = Arrays.copyOfRange(source, 0, source.length);

Ở đây, chúng ta có thể thấy rằng chúng ta đang tạo các DESTINATION1 mảng và sao chép mã nguồn mảng để nó cùng một lúc. Chúng tôi không tạo ra các DESTINATION1 mảng trước khi gọi các copyOfRange()phương pháp. Để tìm hiểu thêm về phương pháp này, hãy truy cập Java copyOfRange .

5. Sao chép mảng 2d bằng cách sử dụng vòng lặp

Tương tự như mảng một chiều, chúng ta cũng có thể sao chép mảng 2 chiều bằng cách sử dụng forvòng lặp. Ví dụ,

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) {

            // allocating space for each row of destination array
            destination[i] = new int[source[i].length];

            for (int j = 0; j < destination[i].length; ++j) {
                destination[i][j] = source[i][j];
            }
        }
     
        // displaying destination array
        System.out.println(Arrays.deepToString(destination));  
      
    }
}

Đầu ra :

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

Trong chương trình trên, lưu ý dòng,

System.out.println(Arrays.deepToString(destination);

Ở đây, deepToString()phương thức được sử dụng để cung cấp một biểu diễn tốt hơn của mảng 2 chiều. Để tìm hiểu thêm, hãy truy cập Java deepToString () .

Sao chép Mảng 2d bằng cách sử dụng arrayycopy ()

Để làm cho đoạn mã trên đơn giản hơn, chúng ta có thể thay thế vòng lặp bên trong bằng System.arraycopy()như trong trường hợp của mảng một chiều. Ví dụ,

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) {

             // allocating space for each row of destination array
             destination[i] = new int[source[i].length];
             System.arraycopy(source[i], 0, destination[i], 0, destination[i].length);
        }
     
        // displaying destination array
        System.out.println(Arrays.deepToString(destination));      
    }
}

Đầu ra :

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

Ở đây, chúng ta có thể thấy rằng chúng ta nhận được cùng một đầu ra bằng cách thay thế forvòng lặp bên trong bằng arraycopy()phương thức.









Gõ tìm kiếm nhanh...