"Anh bạn, tôi hy vọng bây giờ bạn đã nhận ra mảng hữu ích như thế nào trong lập trình?"

"Chắc chắn nhất, Rishi! Tôi đã giải quyết nhiều hơn một nhiệm vụ."

"Nhiệm vụ của bạn có hành động lặp đi lặp lại không? Loại mà bạn đã làm đi làm lại."

"Nếu tôi hiểu đúng ý bạn, thì ý bạn là những hành động giống nhau trong các tác vụ khác nhau? Ví dụ, ở mọi nơi sử dụng vòng lặp để hiển thị nội dung của một mảng — tôi rất mệt mỏi khi phải làm điều đó!"

"Vâng, ý tôi là vậy. Những người sáng tạo Java 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 mảng. Ví dụ: mã để sao chép một phần của mảng sang mảng khác hoặc mã để điền vào từng ô của mảng bằng mã giống nhau hoặc ví dụ của bạn: mã để hiển thị nội dung của một mảng ở dạng có thể đọc được trên màn hình.

"Và những lập trình viên thực thụ có một quy tắc rất quan trọng: không lặp lại chính mình. Bạn sẽ đồng ý rằng làm những việc thừa là sai trái — bạn sẽ không được trả tiền cho việc đó. Tin tôi đi, công việc hiệu quả được trả lương cao. Nhân tiện, một người mới mã có thể được nhận ra ngay lập tức bởi số lượng lớn mã lặp đi lặp lại.

"Những người tạo ra Java đã cân nhắc điều này và 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 đó."

"Hmm... Rất thú vị. Vậy chính xác thì nó có gì?

"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.

Arrays.toString()

"Phương pháp đầu tiên chúng ta sẽ xem xét là Arrays.toString(). Nhưng trước tiên, một chút thông tin cơ bản.

"Mỗi mảng trong Java có một toString()phương thức, phương thức này trả về 'biểu diễn văn bản của mảng'. Bạn có thể nhận 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();

" nameTên của biến mảng ở đâu và strlà tên của biến sẽ lưu trữ biểu diễn chuỗi của mảng. Bạn ơi, bạn đã thử in một mảng ra màn hình bằng phương thức này chưa?System.out.println(name)

Tôi thú nhận, điều đó đã xảy ra. Tôi thấy một số vô nghĩa. Tôi quyết định tránh xa những điều có hại và tiếp tục sử dụng các vòng lặp.

"Rất có thể bạn đã thấy một cái gì đó như:

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ột đối tượng trong bộ nhớ. Bạn có thể coi nó 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, bạn mong đợi điều gì đó khác biệt, phải không?"

"Chính xác! Tôi đã định xem các giá trị trong mảng. Đây là điều cuối cùng tôi mong đợi."

"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?]"

Arrays.deepToString()

"Tuy nhiên, toString()phương pháp này không phù hợp khi nói đến mảng hai chiều. Nói cách khác, nếu bạn thử gọi Arrays.toString(), 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 một chuỗi như thế nào? Chính xác như bạn thấy ở trên.

"Vậy thì phải làm sao? Làm thế nào để chúng ta hiển thị chính xác một mảng hai chiều?"

"Những người tạo ra Java cũng đã lường trước được điều này. Để đạt được mục tiêu này, lớp Arrayscó một phương thức đặc biệt khác — deepToString(). Gọi nó như sau:

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.

Ví dụ:

int[] 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]], [[]]]"

Arrays.equals()

"Chúng tôi đã tìm ra cách hiển thị các mảng trên màn hình. Còn việc so sánh các mảng thì sao? Bạn có nhớ những phương pháp nào chúng tôi có thể sử dụng để so sánh các chuỗi không?"

"Tôi thường sử dụng equalsphương pháp này!

"Có, equalsvà cũng equalsIgnoreCase(so sánh các chuỗi mà không cần quan tâm đến chữ hoa và chữ thường).

"Tin tốt: bạn cũng có thể sử dụng equalsphương thức cho mảng. Tin xấu: nó không so sánh nội dung của 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ụ:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
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)

"Vậy chúng ta phải làm gì? Làm cách nào để so sánh các mảng dựa trên nội dung của chúng?"

"Một lần nữa Arrayslớp đến để giải cứu chúng tôi. Cụ thể hơn, Arrays.equals()phương pháp của nó. Đây là cách chúng tôi gọi nó:

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

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.

"Vì vậy, để 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. Gọi nó 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. Ngược lại, nó 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)

"Cảm ơn Rishi! Bài học này chính là thứ tôi cần để giúp cuộc sống của tôi dễ dàng và hạnh phúc hơn trong tương lai. Bây giờ tôi sẽ sử dụng các phương thức của lớp Arrays và viết chương trình của mình thậm chí còn nhanh hơn.

"Đó là những gì tôi đang mong đợi, ha-ha. Nhưng đây không phải là tất cả các phương pháp thú vị trong lớp Arrays. Tôi sẽ kể cho bạn nghe về những phương pháp khác vào lần sau."