JavaRush /Blog Java /Random-VI /Đôi điều về mảng trong Java

Đôi điều về mảng trong Java

Xuất bản trong nhóm
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 ô: Đôi điều về mảng trong Java - 1Mả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:
  1. 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.
  2. 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.
  3. 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.
Java chỉ ra rằng một mảng đang được tạo bằng cách sử dụng dấu ngoặc vuông []ở 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 :) Đôi điều về mảng trong Java - 2Tứ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 Stringvà thông báo cho trình biên dịch: “Tìm ô có chỉ số 7 trong mảng birthdaysvà 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 lengthlư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 iban đầ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ố intcó 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 lengthsẽ đượ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ượng Cat:
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:
  1. 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ảng catsbao gồm ba ô, mỗi ô chứa một tham chiếu đến một đối tượng Cat. Mỗi liên kết trỏ đến một địa chỉ trong bộ nhớ nơi đối tượng đó được lưu trữ.
  2. 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 catstrỏ đế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. A cats[0]- đến một địa chỉ cụ thể trong khối này.
Đôi điều về mảng trong Java - 3Điều quan trọng là phải hiểu rằng mảng không chỉ có thể lưu trữ các đối tượng mà bản thân nó còn là một đối tượng.

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ố, intmỗi mảng có 10 ô. Nó sẽ trông như thế này: Đôi điều về mảng trong Java - 4Mỗ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 numbersdướ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”: Đôi điều về mảng trong Java - 5Cấ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.
  1. 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ụ.
  2. 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ớpArray
  3. Mảng là bài giảng JavaRush đầu tiên dành riêng cho mảng.
  4. Mảng đa chiều - bài viết chi tiết về mảng đa chiều kèm ví dụ.
  5. 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.
Điều này kết thúc lần làm quen đầu tiên của chúng ta với mảng, nhưng đây mới chỉ là bước khởi đầu cho quá trình tương tác với chúng. Trong các bài giảng sau, chúng ta sẽ thấy những cách thú vị để sử dụng chúng, đồng thời tìm hiểu xem Java có những hàm dựng sẵn nào để làm việc thuận tiện hơn với cấu trúc dữ liệu này :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION