Xin chào! Trước đây, trong quá trình đào tạo, chúng ta đã làm việc với các đối tượng đơn lẻ (hoặc các kiểu nguyên thủy). Nhưng điều gì sẽ xảy ra nếu chúng ta cần làm việc không phải với một đối tượng mà với cả một nhóm? Ví dụ: chúng tôi muốn tạo danh sách ngày sinh nhật của tất cả nhân viên trong công ty của chúng tôi. Ví dụ: nó phải chứa 30 dòng có định dạng: “Andrey Petrov, ngày 25 tháng 1”. Một cấu trúc dữ liệu đặc biệt, một mảng, sẽ giúp chúng ta ở đây. Nếu bạn so sánh mảng với các đối tượng trong đời thực, cấu trúc của nó rất giống với một kho tiền ngân hàng có các ô: Mảng cũng bao gồm các ô. Bạn có thể đặt một cái gì đó vào mỗi ô. Trong trường hợp này, để truy cập nội dung bạn cần biết số ô. Mảng được tạo như thế này:
public class Main {
public static void main(String[] args) {
String [] birthdays = new String[10]; // array of Java strings
}
}
Ở đây chúng tôi đã tạo ra một mảng gồm 10 ô. Bạn có thể chú ý ngay đến một số tính năng của mảng:
- Nó lưu trữ dữ liệu thuộc loại được xác định nghiêm ngặt. Nếu ban đầu chúng ta tạo một mảng chuỗi
String
, chúng ta sẽ không thể lưu trữ bất kỳ thứ gì khác trong đó. Kiểu dữ liệu được chỉ định khi tạo mảng. Đây là điểm khác biệt của nó với hộp ký gửi an toàn, trong đó khách hàng có thể cất giữ bất cứ thứ gì mình muốn. - Một mảng có thể lưu trữ dữ liệu thuộc các kiểu nguyên thủy (ví dụ:
int
), chuỗi (String
) hoặc các đối tượng của cùng một lớp. Chính xác hơn, thậm chí không phải bản thân các đối tượng mà liên kết với các đối tượng này. - Kích thước của mảng phải được chỉ định trong quá trình tạo. Bạn sẽ không thể chỉ định nó sau này hoặc thay đổi kích thước nó sau khi tạo.
[]
ở cả hai phía của biểu thức. Chúng có thể được chỉ định trước tên của biến tham chiếu hoặc sau - nó sẽ hoạt động theo một trong hai cách:
//Java arrays of strings, two syntaxes
String [] birthdays = new String[10];
String birthdays [] = new String[10];
Nếu bạn muốn ghi một cái gì đó vào một mảng, bạn cần chỉ định số ô mà giá trị sẽ được ghi vào. Số ô của mảng bắt đầu từ 0. Bắt đầu từ 0 là cách làm phổ biến trong lập trình. Bạn làm quen càng nhanh thì càng tốt :) Tức là, nếu bạn muốn đặt một số giá trị vào ô đầu tiên của mảng thì thực hiện như sau:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
}
}
Bây giờ, ô đầu tiên trong mảng của chúng ta, chứa ngày sinh nhật của đồng nghiệp, chứa một chuỗi có ngày sinh nhật của Lena. Bằng cách tương tự, bạn có thể thêm các giá trị khác:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
birthdays[1] = "Kolya Romanov, May 18";
birthdays[7] = "Olesya Ostapenko, January 3";
}
}
Xin lưu ý: chúng tôi đã thêm ngày sinh nhật của Olesya vào ô thứ tám (bạn đã quên tại sao ô số 7 lại là ô thứ tám rồi phải không?). Mặc dù tất cả các ô khác không được điền vào. Không cần thiết phải ghi các giá trị vào mảng theo thứ tự - không có hạn chế nào như vậy. Mặt khác, nếu viết theo thứ tự thì việc theo dõi số ô trống và ô chiếm sẽ dễ dàng hơn rất nhiều và sẽ không còn “lỗ hổng” nào trong mảng. Nếu bạn muốn lấy nội dung của một ô mảng, như trong trường hợp ô ngân hàng, bạn cần biết số của nó. Điều này được thực hiện như thế này:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
birthdays[1] = "Kolya Romanov, May 18";
birthdays[7] = "Olesya Ostapenko, January 3";
String olesyaBirthday = birthdays[7];
System.out.println(olesyaBirthday);
}
}
Đầu ra của bảng điều khiển:
Олеся Остапенко, 3 января
Chúng tôi đã tạo một biến String
và thông báo cho trình biên dịch: “Tìm ô có chỉ số 7 trong mảng birthdays
và gán giá trị được lưu ở đó cho biến String
olesyaBirthday
”. Đó chính xác là những gì anh ấy đã làm.
Độ dài mảng Java
Khi làm việc với một mảng, bạn có thể dễ dàng tìm ra độ dài của nó bằng cách sử dụng thuộc tính đặc biệt -length
.
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
birthdays[1] = "Kolya Romanov, May 18";
birthdays[7] = "Olesya Ostapenko, January 3";
int birthdaysLength = birthdays.length;
System.out.println(birthdaysLength);
}
}
Đầu ra của bảng điều khiển:
10
Ghi chú:Thuộc tính length
lưu trữ kích thước của mảng chứ không phải số lượng ô được điền. Mảng của chúng ta chỉ lưu trữ 3 giá trị nhưng khi tạo chúng ta đã chỉ định size = 10, đây là giá trị mà trường trả về length
. Tại sao điều này có thể hữu ích? Chà, ví dụ: nếu bạn muốn in danh sách tất cả các ngày sinh nhật ra bảng điều khiển (để kiểm tra xem không có ai bị quên), bạn có thể thực hiện việc này bằng một vòng lặp đơn giản:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
birthdays[1] = "Kolya Romanov, May 18";
birthdays[2] = "Vika Ignatova, July 12";
birthdays[3] = "Denis Kozlov, September 7";
birthdays[4] = "Maxim Maslennikov, November 9";
birthdays[5] = "Roman Baranov, August 14";
birthdays[6] = "Valery Pyatkina, April 1";
birthdays[7] = "Olesya Ostapenko, January 3";
birthdays[8] = "Kostya Gurko, October 19";
birthdays[9] = "Seryozha Naumov, May 3";
for (int i = 0; i < birthdays.length; i++) {
System.out.println(birthdays[i]);
}
}
}
Trong vòng lặp, chúng ta tạo một biến i
ban đầu bằng 0. Trên mỗi lần chuyển, chúng tôi lấy ô có chỉ mục i từ mảng của mình và in giá trị của nó ra bảng điều khiển. Vòng lặp sẽ thực hiện 10 lần lặp và các giá trị của i sẽ tăng từ 0 lên 9 - đúng theo chỉ số của các ô trong mảng của chúng ta! Bằng cách này chúng ta sẽ in tất cả các giá trị từ birthdays[0]
tới ra console birthdays[9]
... Trên thực tế, có nhiều cách để tạo một mảng khác nhau. Ví dụ: một dãy số int
có thể được tạo như thế này:
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
}
}
Phương pháp này được gọi là “khởi tạo nhanh”. Nó khá thuận tiện ở chỗ chúng ta ngay lập tức tạo một mảng và điền các giá trị vào đó. Không cần chỉ định rõ ràng kích thước của mảng - trường length
sẽ được điền tự động trong quá trình khởi tạo nhanh.
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
System.out.println(numbers.length);
}
}
Đầu ra của bảng điều khiển:
9
Mảng đối tượng Java
Bạn đã nghe nói rằng mảng đối tượng và mảng nguyên thủy được lưu trữ trong bộ nhớ khác nhau. Ví dụ: hãy lấy một mảng gồm ba đối tượngCat
:
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public static void main(String[] args) {
Cat[] cats = new Cat[3];
cats[0] = new Cat("Thomas");
cats[1] = new Cat("Hippopotamus");
cats[2] = new Cat("Philip Markovich");
}
}
Có một vài điều cần hiểu ở đây:
- Trong trường hợp nguyên thủy, mảng Java lưu trữ nhiều giá trị cụ thể (chẳng hạn như số
int
). Trong trường hợp đối tượng, một mảng lưu trữ nhiều tham chiếu. Mảngcats
bao gồm ba ô, mỗi ô chứa một tham chiếu đến một đối tượngCat
. Mỗi liên kết trỏ đến một địa chỉ trong bộ nhớ nơi đối tượng đó được lưu trữ. - Các phần tử mảng được lưu trữ trong bộ nhớ trong một khối duy nhất. Điều này được thực hiện để truy cập chúng hiệu quả hơn và nhanh chóng hơn. Do đó, liên kết
cats
trỏ đến một khối trong bộ nhớ nơi lưu trữ tất cả các đối tượng - các phần tử của mảng. Acats[0]
- đến một địa chỉ cụ thể trong khối này.
Mảng mảng hoặc mảng hai chiều
Dựa trên điều này, chúng ta phải đối mặt với câu hỏi - chẳng hạn, chúng ta có thể tạo không phải một mảng chuỗi hoặc số mà là một mảng mảng không? Và câu trả lời sẽ là - vâng, chúng tôi có thể! Một mảng có thể lưu trữ bất kỳ đối tượng nào bên trong nó, bao gồm cả các mảng khác. Mảng như vậy sẽ được gọi là mảng hai chiều. Nếu bạn mô tả nó bằng một bức tranh, nó sẽ trông rất giống một chiếc bàn thông thường. Ví dụ: chúng tôi muốn tạo một mảng sẽ lưu trữ 3 mảng số,int
mỗi mảng có 10 ô. Nó sẽ trông như thế này: Mỗi dòng biểu thị một mảng số int
. Mảng đầu tiên chứa các số từ 1 đến 10, mảng thứ hai - từ -1 đến -10, mảng thứ ba - một tập hợp các số ngẫu nhiên. Mỗi mảng này được lưu trữ trong một ô của mảng hai chiều của chúng tôi. Việc khởi tạo mảng hai chiều trong mã trông như thế này:
public static void main(String[] args) {
Cat[][] cats = new Cat[3][5];
}
Mảng mèo hai chiều của chúng tôi lưu trữ 3 mảng, mỗi mảng có 5 ô. Nếu chúng ta muốn đặt đối tượng của mình vào ô thứ ba của mảng thứ hai, chúng ta làm như sau:
public static void main(String[] args) {
Cat[][] cats = new Cat[3][5];
cats[1][2] = new Cat("Fluff");
}
[1]
trỏ đến mảng thứ hai và [2]
trỏ đến ô thứ ba của mảng này. Vì mảng hai chiều bao gồm một số mảng, để duyệt qua nó và in tất cả các giá trị ra bàn điều khiển (hoặc điền vào tất cả các ô), chúng ta cần một vòng lặp lồng nhau:
for (int i = 0; i < cats.length; i++) {
for (int j = 0; j < cats[i].length; j++) {
System.out.println(cats[i][j]);
}
}
Trong vòng lặp bên ngoài (biến i
), chúng ta lần lượt duyệt qua tất cả các mảng tạo nên mảng hai chiều của chúng ta. Trong vòng lặp bên trong (biến j
), chúng ta lặp qua tất cả các ô của mỗi mảng. Kết quả là đối tượng cats[0][0]
(mảng đầu tiên, ô đầu tiên) sẽ được hiển thị đầu tiên trên bảng điều khiển và đối tượng thứ hai sẽ là cats[0][1]
(mảng đầu tiên, ô thứ hai). Khi mảng đầu tiên đã hết, , cats[1][0]
, cats[1][1]
v.v. cats[1][2]
sẽ được xuất ra. Nhân tiện, tính năng khởi tạo nhanh cũng có sẵn cho mảng hai chiều:
int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
Thông thường, chúng ta sẽ viết một mảng hai chiều numbers
dưới dạng int[3][3]
, nhưng phương pháp này cho phép chúng ta chỉ định ngay các giá trị. Tại sao có thể cần mảng hai chiều? Chà, chẳng hạn, với sự trợ giúp của nó, bạn có thể dễ dàng tạo lại trò chơi nổi tiếng “Battleship”: Cấu trúc của sân chơi trong “Battleship” có thể được mô tả dễ dàng: một mảng hai chiều gồm 10 mảng, mỗi mảng 10 ô . Bạn tạo hai mảng như vậy - cho chính bạn và đối thủ của bạn:
int [][] seaBattle = new int[10][10];
int [][] seaBattle2 = new int[10][10];
Bạn điền một số giá trị (ví dụ: số hoặc ký hiệu *
) vào các ô chứa tàu của bạn, sau đó bạn và đối thủ lần lượt gọi các số ô đó:
- biểnTrận chiến[6] [5]!
- Quá khứ! seaBattle2[6][6]!
- Bị thương!
- seaBattle2[6][7]!
- Bị thương!
- seaBattle2[6][8]!,
- Bị giết!
Tài nguyên bổ sung về mảng
Bạn muốn biết thêm về mảng? Mời bạn tham khảo các bài viết dưới đây. Có rất nhiều thông tin thú vị và hữu ích về chủ đề này.- Mảng trong Java - một bài viết chi tiết về mảng, cách tạo, khởi tạo và sử dụng chúng. Với các ví dụ.
- Lớp Arrays và công dụng của nó - bài viết mô tả một số phương thức của lớp
Array
- Mảng là bài giảng JavaRush đầu tiên dành riêng cho mảng.
- Mảng đa chiều - bài viết chi tiết về mảng đa chiều kèm ví dụ.
- Trả về một mảng có độ dài bằng 0, không phải null - Tác giả Lập trình hiệu quả Joshua Bloch nói về cách trả về các mảng trống tốt hơn.
GO TO FULL VERSION