1. Arrayslớp học

Như chúng tôi đã lưu ý trước đây, mảng rất hữu ích và được sử dụng thường xuyên trong lập trình.

Những người tạo ra Java rất nhanh chóng nhận thấy rằng các lập trình viên Java thường viết cùng một mã khi làm việc với các mảng. Ví dụ: sao chép một phần của mảng sang mảng khác, viết mã để điền vào từng ô của mảng với cùng một giá trị, hiển thị nội dung của mảng ở định dạng thuận tiện, v.v.

Đó là lý do tại sao họ tạo ra Arrayslớp đặc biệt (tên đầy đủ của nó là java.util.Arrays), đưa các hành động liên quan đến mảng phổ biến nhất vào đó.

Có rất nhiều phương pháp cho mọi trường hợp, nhưng trước tiên chúng ta sẽ chỉ xem xét 10 phương pháp trong số đó — cách đơn giản nhất và thường được sử dụng nhất.


2.Arrays.toString()

Phương pháp đầu tiên chúng ta sẽ xem xét được gọi là Arrays.toString(). Nhưng trước tiên, một nền tảng nhỏ.

Mỗi mảng trong Java có một toString()phương thức, phương thức này trả về một 'biểu diễn văn bản của mảng'. Bạn có thể nhận được một biểu diễn văn bản của một mảng bằng cách sử dụng câu lệnh sau:

String str = name.toString();

Đâu namelà tên của biến mảng, và strlà tên của biến sẽ lưu trữ biểu diễn chuỗi của mảng.

Nhưng nếu bạn cố gắng in mảng ra màn hình bằng phương pháp này, rất có thể bạn sẽ thấy nội dung như sau:System.out.println(name)

I@37afeb11

Chữ cái đầu tiên Icó nghĩa là nó là một intmảng và các ký hiệu sau @là địa chỉ của mảng trong bộ nhớ. Một mặt, đây chính xác là thông tin được lưu trữ trong biến mảng, nhưng mặt khác, chúng ta mong đợi một điều gì đó khác biệt, phải không?

Chúng tôi muốn xem các giá trị trong mảng! Và đó chính xác là lý do tại sao họ nghĩ ra Arrays.toString()phương pháp này — để hiển thị các giá trị của một mảng. Chúng tôi gọi nó như thế này:

String str = Arrays.toString(name);

Ví dụ:

int[] array = {1, 2, 3};
String str = Arrays.toString(array);
Biến strsẽ chứa chuỗi:
"[1, 2, 3]"
int[] array = {};
String str = Arrays.toString(array);
Biến strsẽ chứa chuỗi:
"[]"
String[] array = {"Hi", "How's", "life?"};
String str = Arrays.toString(array);
Biến strsẽ chứa chuỗi:
"[Hi, How's, life?]"


3.Arrays.deepToString()

Nhưng nếu bạn thử chuyển đổi một mảng hai chiều thành một using the Arrays.toString()phương thức chuỗi (để hiển thị nó), bạn sẽ thấy một số thứ quen thuộc:

[I@37afeb11, I@37afeb21, I@37afeb31]

Tất cả là do các ô của mảng hai chiều lưu trữ các tham chiếu đến mảng một chiều. Và mảng một chiều được chuyển đổi thành chuỗi như thế nào? Chính xác như bạn thấy ở trên.

Những gì có thể được thực hiện? Làm cách nào để hiển thị chính xác mảng hai chiều?

Cuối cùng, Arrayslớp có một phương thức đặc biệt khác — deepToString(). Gọi nó trông như thế này:

String str = Arrays.deepToString(name);

Phương thức này có thể truyền các mảng hai chiều, một chiều, ba chiều hoặc nói chung là bất kỳ chiều nào và nó sẽ luôn hiển thị các phần tử của mảng.
Lưu ý: phương pháp này Arrays.deepToString()không hoạt động với mảng một chiều nguyên thủy (ví dụ: int[]).

Ví dụ:

Integer[] array = {1, 2, 3};
String str = Arrays.deepToString(array);
Biến strsẽ chứa chuỗi:
"[1, 2, 3]"
int[][] array = { {1, 1}, {2, 2}, {3, 3} };
String str = Arrays.deepToString(array);
Biến strsẽ chứa chuỗi:
"[[1, 1], [2, 2], [3, 3]]"
int[][][] array = { {{1, 2, 3}, {1}}, {{}} };
String str = Arrays.deepToString(array);
Biến strsẽ chứa chuỗi:
"[[[1, 2, 3], [1]], [[]]]"


4.Arrays.equals()

Chúng tôi đã tìm ra cách hiển thị các mảng trên màn hình, nhưng so sánh các mảng thì sao?

Để so sánh các chuỗi, chúng ta có các phương thức equalsequalsIgnoreCase, nhưng mảng có những phương thức nào?

Tin vui là các mảng có một equalsphương thức. Tin xấu là nó không so sánh nội dung của các mảng. Phương equalsthức của mảng thực hiện tương tự như ==toán tử — nó so sánh các tham chiếu. Ví dụ:

Ví dụ:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
boolean b = x1 == x2;


false(các tài liệu tham khảo không bằng nhau)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
Phương equalspháp arraysđơn giản là so sánh các tham chiếu của hai mảng.

false(các tài liệu tham khảo không bằng nhau)

Những gì có thể được thực hiện? Làm cách nào để so sánh các mảng dựa trên nội dung của chúng?

Và một lần nữa Arraysgiải cứu chúng ta, hay cụ thể hơn là Arrays.equals()phương pháp của nó. Đây là cách chúng tôi gọi nó là:

Arrays.equals(name1, name2)

Phương thức trả về truenếu các mảng có độ dài bằng nhau và các phần tử của chúng bằng nhau. Nếu không, nó sẽ trả về false.

Ví dụ:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
Phương equalspháp arrays đơn giản là so sánh các tham chiếu của hai mảng.

false(các tài liệu tham khảo không bằng nhau)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
Arrays.equals(x1, x2);


true(nội dung bằng nhau)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3, 4};
Arrays.equals(x1, x2);


false(nội dung của các mảng là khác nhau)

5.Arrays.deepEquals()

Và, như bạn có thể đã đoán, Arrays.equalsphương thức này sẽ không hoạt động chính xác đối với mảng hai chiều: nó xử lý mảng hai chiều giống như mảng một chiều có các phần tử là địa chỉ của mảng một chiều.

Do đó, để so sánh chính xác các mảng nhiều chiều ( n = 1, 2, 3,...), họ đã nghĩ ra Arrays.deepEquals()phương pháp này. Gọi nó trông như thế này:

Arrays.deepEquals(name1, name2)

Phương thức trả vềtruenếu các mảng có độ dài bằng nhau và các phần tử của chúng bằng nhau. Nếu không, nó sẽ trả vềfalse. Nếu các phần tử bên trong mảng cũng là mảng, thì Arrays.deepEquals()phương thức này được sử dụng để so sánh chúng, v.v.

Ví dụ:

int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
x1.equals(x2);
Phương equalspháp arrays đơn giản là so sánh các tham chiếu của hai mảng.

false(các tài liệu tham khảo không bằng nhau)
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
Arrays.equals(x1, x2);
Phương Arrays.equalsthức sẽ so sánh và dưới dạng mảng một chiều lưu trữ các tham chiếu. Chúng chứa các tài liệu tham khảo khác nhau. (nội dung của các mảng không bằng nhau) x1x2
false
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
Arrays.deepEquals(x1, x2);


true(nội dung bằng nhau)