1. Giới thiệu
Mảng trong Java — công cụ mạnh mẽ, nhưng cú pháp cơ bản dễ nhanh chóng rơi vào công việc lặp lại. Lớp java.util.Arrays — tập hợp các phương thức tĩnh để làm việc với mảng: sắp xếp, sao chép, so sánh, in định dạng và hơn thế nữa. Không cần tạo đối tượng — tất cả phương thức đều là tĩnh và được gọi qua tên lớp.
Để sử dụng các phương thức, hãy thêm import ở đầu tệp:
import java.util.Arrays;
Nếu quên import, trình biên dịch sẽ báo rằng Arrays “không được tìm thấy” — đây không phải là lỗi mà là hành vi dự kiến khi không có import.
2. Sắp xếp mảng: Arrays.sort
Cách hoạt động của Arrays.sort
Cú pháp
Arrays.sort(massiv);
Arrays.sort(massiv, nachalnyyIndeks, konechnyyIndeks);
Phương thức sắp xếp “tại chỗ” — thay đổi mảng gốc và không trả về mảng mới. Muốn giữ thứ tự ban đầu? Hãy sao chép mảng trước.
Ví dụ: sắp xếp mảng số nguyên
int[] scores = {5, 2, 9, 1, 7};
Arrays.sort(scores); // Sắp xếp tăng dần
System.out.println("Mảng đã được sắp xếp: " + Arrays.toString(scores));
// Sẽ in: [1, 2, 5, 7, 9]
Ví dụ: sắp xếp mảng chuỗi
String[] names = {"Vasya", "Petya", "Anya", "Igor"};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
// [Anya, Igor, Petya, Vasya]
Lưu ý: chuỗi được sắp xếp theo thứ tự từ điển (theo bảng chữ cái), số — theo thứ tự tăng dần.
Sắp xếp một phần của mảng
int[] arr = {7, 5, 3, 1, 9, 8};
Arrays.sort(arr, 1, 4); // sắp xếp các phần tử từ chỉ số 1 đến 3 (4 không được tính)
System.out.println(Arrays.toString(arr));
// [7, 1, 3, 5, 9, 8]
Đặc điểm
- Sắp xếp “tại chỗ”: mảng gốc bị thay đổi.
- Số — theo thứ tự tăng dần, chuỗi — theo bảng chữ cái.
- Với đối tượng phức tạp, dùng phiên bản có comparator.
3. Điền (fill) mảng: Arrays.fill
Cú pháp
Arrays.fill(massiv, znachenie);
Arrays.fill(massiv, nachalnyyIndeks, konechnyyIndeks, znachenie);
Phương thức điền tất cả phần tử hoặc phần được chỉ định của mảng bằng cùng một giá trị.
int[] marks = new int[5];
Arrays.fill(marks, 3); // Tất cả phần tử giờ bằng 3
System.out.println(Arrays.toString(marks)); // [3, 3, 3, 3, 3]
Điền một phần của mảng
int[] arr = new int[10];
Arrays.fill(arr, 2, 5, 7); // Sẽ điền các phần tử từ chỉ số 2 đến 4 (5 không được tính)
System.out.println(Arrays.toString(arr));
// [0, 0, 7, 7, 7, 0, 0, 0, 0, 0]
Điền mảng chuỗi
String[] guests = new String[4];
Arrays.fill(guests, "Trống");
System.out.println(Arrays.toString(guests)); // [Trống, Trống, Trống, Trống]
4. Sao chép mảng: Arrays.copyOf và Arrays.copyOfRange
Arrays.copyOf
Cú pháp
Arrays.copyOf(iskhodnyyMassiv, novayaDlina);
Tạo một mảng mới và sao chép phần tử từ mảng gốc. Nếu độ dài mới lớn hơn độ dài gốc, “đuôi” sẽ được điền bằng các giá trị mặc định (0 cho int, null cho kiểu tham chiếu).
int[] original = {1, 2, 3};
int[] copy = Arrays.copyOf(original, 5);
System.out.println(Arrays.toString(copy)); // [1, 2, 3, 0, 0]
Thu nhỏ mảng
int[] shortCopy = Arrays.copyOf(original, 2);
System.out.println(Arrays.toString(shortCopy)); // [1, 2]
Arrays.copyOfRange
Cú pháp
Arrays.copyOfRange(iskhodnyyMassiv, nachalnyyIndeks, konechnyyIndeks);
int[] arr = {10, 20, 30, 40, 50};
int[] mid = Arrays.copyOfRange(arr, 1, 4); // Sao chép các phần tử từ chỉ số 1 tới 3
System.out.println(Arrays.toString(mid)); // [20, 30, 40]
5. So sánh mảng: Arrays.equals và Arrays.deepEquals
Trong Java không thể so sánh mảng bằng == — cách này chỉ so sánh tham chiếu chứ không phải nội dung:
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a == b); // false!
So sánh nội dung như thế nào?
Arrays.equals(massiv1, massiv2);
Arrays.deepEquals(matritsa1, matritsa2);
System.out.println(Arrays.equals(a, b)); // true
Với mảng một chiều dùng Arrays.equals, với mảng hai chiều trở lên — Arrays.deepEquals.
Ví dụ: so sánh mảng hai chiều
int[][] matrix1 = {{1, 2}, {3, 4}};
int[][] matrix2 = {{1, 2}, {3, 4}};
System.out.println(Arrays.equals(matrix1, matrix2)); // false!
System.out.println(Arrays.deepEquals(matrix1, matrix2)); // true
6. In mảng đẹp: Arrays.toString và Arrays.deepToString
In trực tiếp mảng sẽ cho một chuỗi khó đọc:
int[] arr = {1, 2, 3};
System.out.println(arr); // [I@7a81197d
Cú pháp
Arrays.toString(massiv);
Arrays.deepToString(matritsa);
System.out.println(Arrays.toString(arr)); // [1, 2, 3]
int[][] matrix = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepToString(matrix)); // [[1, 2], [3, 4]]
7. Những lỗi thường gặp khi làm việc với lớp Arrays
Lỗi 1: cố gắng so sánh mảng bằng ==
Mảng là đối tượng, và == chỉ so sánh tham chiếu. Ngay cả khi giá trị giống nhau, kết quả vẫn là false. Hãy dùng Arrays.equals (cho mảng một chiều) hoặc Arrays.deepEquals (cho mảng đa chiều).
Lỗi 2: quên rằng sắp xếp thay đổi mảng “tại chỗ”
Nếu cần giữ thứ tự ban đầu, hãy tạo bản sao bằng Arrays.copyOf, rồi mới sắp xếp bản sao. Nếu không, mảng gốc sẽ mất thứ tự.
Lỗi 3: hiểu sai về ranh giới trong Arrays.fill và Arrays.copyOfRange
Các phương thức dùng khoảng nửa mở: chỉ số phải không được tính. Ví dụ, Arrays.fill(arr, 2, 5, 9) sẽ điền các chỉ số 2, 3, 4, còn phần tử có chỉ số 5 sẽ không bị chạm tới.
Lỗi 4: cố gắng in mảng trực tiếp
Gọi System.out.println(arr) sẽ in biểu diễn kỹ thuật. Hãy dùng Arrays.toString cho mảng một chiều và Arrays.deepToString cho mảng đa chiều.
Lỗi 5: so sánh mảng đa chiều bằng Arrays.equals
Phương thức chỉ so sánh cấp độ trên cùng (tham chiếu tới mảng con). Để so sánh nội dung, hãy dùng Arrays.deepEquals.
GO TO FULL VERSION