Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Sao chép đoạn mảng trong Java: copyOf() vs copyOfRange()

Lớp java.util.Arrays cung cấp 2 phương thức tiện ích để copy một phần mảng:

1. Arrays.copyOf(original, newLength)

Copy từ đầu mảng đến độ dài newLength. Nếu newLength > original.length, phần mở rộng được điền giá trị mặc định (null/0/false).


String[] src = {"Java", "Python", "Go", "Rust", "Kotlin"};
String[] first3 = Arrays.copyOf(src, 3);
// ["Java", "Python", "Go"]

2. Arrays.copyOfRange(original, from, to)

Copy đoạn từ from (inclusive) đến to (exclusive). Linh hoạt hơn.


String[] middle = Arrays.copyOfRange(src, 1, 4);
// ["Python", "Go", "Rust"]

Ví dụ so sánh đầy đủ


import java.util.Arrays;

public class ArrayCopyDemo {
    public static void main(String[] args) {
        String[] techs = {"Java", "Python", "Go", "Rust", "Kotlin", "Swift", "Dart"};
        System.out.println("Gốc: " + Arrays.toString(techs));
        
        // copyOf: 4 phần tử đầu
        String[] first4 = Arrays.copyOf(techs, 4);
        System.out.println("copyOf(4): " + Arrays.toString(first4));
        
        // copyOfRange: index 2 đến 5 (Go, Rust, Kotlin)
        String[] range = Arrays.copyOfRange(techs, 2, 5);
        System.out.println("copyOfRange(2,5): " + Arrays.toString(range));
        
        // copyOfRange vượt giới hạn → ném ArrayIndexOutOfBoundsException
        // Arrays.copyOfRange(techs, 2, 10); // Lỗi!
    }
}

Kết quả


Gốc: [Java, Python, Go, Rust, Kotlin, Swift, Dart]
copyOf(4): [Java, Python, Go, Rust]
copyOfRange(2,5): [Go, Rust, Kotlin]

Lưu ý quan trọng

  • Cả hai đều trả về mảng mới (shallow copy – các object element vẫn chung tham chiếu)
  • Đối với mảng primitive: copy giá trị
  • Đối với mảng object: copy tham chiếu
  • Cần deep copy? Duyệt mảng và clone từng element