Mảng đối tượng trong Java
⚡ Tóm tắt thông minh
Mảng đối tượng trong Java Lưu trữ các tham chiếu đối tượng trong một vùng nhớ liền kề có kích thước cố định, cho phép một biến duy nhất chứa nhiều thể hiện của một lớp và truy cập từng thể hiện thông qua chỉ mục để lặp lại, thay đổi và truyền vào các phương thức.
Mảng các đối tượng là gì? Java?
A Java mảng đồ vật Lưu trữ nhiều thể hiện đối tượng của cùng một lớp trong một vùng chứa có kích thước cố định. Không giống như mảng kiểu dữ liệu nguyên thủy lưu trữ các giá trị như... int, double, hoặc là boolean trực tiếp trong mỗi ô, một mảng các đối tượng được lưu trữ. tài liệu tham khảoMỗi khe (slot) trỏ đến vị trí bộ nhớ của một đối tượng, và bản thân đối tượng đó nằm trên bộ nhớ. Java đống.
Bố cục này phù hợp với mọi đối tượng. biến in Java Cách này hiệu quả. Mảng đơn giản chỉ nhóm nhiều tham chiếu đối tượng lại với nhau để bạn có thể truy cập chúng theo chỉ mục. Đây là lựa chọn tự nhiên khi số lượng đối tượng được biết trước và không thay đổi trong suốt vòng đời của chương trình.
cú pháp
ClassName[] obj = new ClassName[array_length];
Phía bên phải dành không gian cho array_length các tham chiếu, tất cả đều được khởi tạo thành nullKhông có đối tượng nào ClassName Hiện tại vẫn chưa có, chỉ có vùng chứa có thể lưu trữ các tham chiếu đến các đối tượng đó mà thôi.
Cách tạo mảng các đối tượng trong Java
Việc tạo một mảng các đối tượng hoạt động luôn cần hai bước cấp phát. Bước đầu tiên cấp phát vùng chứa tham chiếu, và bước thứ hai cấp phát từng đối tượng mà vùng chứa đó sẽ trỏ tới. Bỏ quaping Bước thứ hai là nguồn gốc phổ biến nhất của... NullPointerException ở trình độ sơ cấp Java Mã.
Bước 1) Mở trình biên tập mã và sao chép đoạn mã sau:
class ObjectArray { public static void main(String args[]) { Account obj[] = new Account[2]; // obj[0] = new Account(); // obj[1] = new Account(); obj[0].setData(1, 2); obj[1].setData(3, 4); System.out.println("For Array Element 0"); obj[0].showData(); System.out.println("For Array Element 1"); obj[1].showData(); } } class Account { int a; int b; public void setData(int c, int d) { a = c; b = d; } public void showData() { System.out.println("Value of a = " + a); System.out.println("Value of b = " + b); } }
Bước 2) Lưu tệp dưới dạng ObjectArray.javaSau đó biên dịch và chạy chương trình.
Bước 3) Hãy ghi nhận lỗi. Cố gắng gỡ lỗi trước khi tiếp tục Bước 4.
Bước 4) Kiểm tra đường dây Account obj[] = new Account[2];Nó cấp phát một mảng gồm hai biến tham chiếu thuộc loại . Accountnhưng nó không phân bổ bất kỳ Account vật thể. Cả hai khe đều chứa nullvà gọi obj[0].setData(...) trên null tham chiếu ném ra một NullPointerException trong thời gian chạy.
Bước 5) Bỏ dấu chú thích ở dòng 4 và 5. Hai dòng này tạo ra sự thật. Account các đối tượng và gán chúng cho obj[0] và obj[1]Mảng giờ đây chứa các tham chiếu thực sự và mã chạy trơn tru.
Đầu ra:
For Array Element 0 Value of a = 1 Value of b = 2 For Array Element 1 Value of a = 3 Value of b = 4
Cách khởi tạo một mảng các đối tượng trong Java
Ngoài cách khởi tạo dựa trên phương thức setter như đã trình bày ở trên, mảng các đối tượng có thể được khởi tạo theo ba cách gọn gàng hơn. Mỗi kiểu đều đánh đổi sự rườm rà lấy sự rõ ràng, vì vậy hãy chọn kiểu phù hợp nhất với tình huống.
- Khởi tạo vòng lặp — Cấp phát mảng, sau đó duyệt qua từng chỉ mục và gán một đối tượng mới. Đây là mô hình chuẩn cho các mảng lớn hoặc khi số lượng đối tượng thay đổi liên tục.
- Khởi tạo hàm tạo — Truyền trực tiếp các giá trị vào hàm tạo tại thời điểm tạo đối tượng, do đó không cần gọi phương thức setter riêng biệt.
- Khởi tạo hằng số mảng — Khai báo và điền dữ liệu trong một câu lệnh duy nhất bằng cách sử dụng câu lệnh nội tuyến.
{ ... }Công cụ khởi tạo, lý tưởng cho các tập hợp nhỏ, cố định.
class Account { int a, b; public Account(int a, int b) { // constructor this.a = a; this.b = b; } } public class InitDemo { public static void main(String[] args) { // 1) Loop initialisation Account[] loopArr = new Account[3]; for (int i = 0; i < loopArr.length; i++) { loopArr[i] = new Account(i, i * 10); } // 2) Constructor initialisation, one slot at a time Account[] ctorArr = new Account[2]; ctorArr[0] = new Account(1, 2); ctorArr[1] = new Account(3, 4); // 3) Array literal initialisation Account[] litArr = { new Account(5, 6), new Account(7, 8), new Account(9, 10) }; System.out.println("loop size = " + loopArr.length); System.out.println("ctor size = " + ctorArr.length); System.out.println("literal size= " + litArr.length); } }
Khởi tạo vòng lặp là phương án mặc định an toàn nhất vì nó đảm bảo không còn chỗ trống nào. nullViệc khởi tạo bằng hàm tạo giúp làm rõ ý định khi mỗi đối tượng cần các đối số khác nhau, và các mảng hằng giúp mã demo nhỏ gọn hơn. Không nên trộn lẫn các kiểu lập trình trong cùng một mảng trừ khi có lý do chính đáng: tính nhất quán giúp dễ dàng phát hiện lỗi hơn.
Lặp lại và truy cập các phần tử trong một Java Mảng đối tượng
Sau khi mảng các đối tượng được điền đầy đủ, ba kiểu vòng lặp có thể đáp ứng hầu hết mọi nhu cầu truy cập. Hãy chọn kiểu vòng lặp phù hợp với mức độ kiểm soát chỉ mục mà mã cần.
Cổ điển for vòng lặp Cung cấp quyền truy cập vào chỉ mục, rất hữu ích để thay thế các phần tử, so sánh các phần tử lân cận hoặc lặp lại một phạm vi con.
for (int i = 0; i < obj.length; i++) { System.out.println("Element " + i); obj[i].showData(); }
tăng cường for vòng lặp (Vòng lặp “for-each”) ẩn chỉ mục và giúp mã dễ đọc hơn khi không cần đến chỉ mục:
for (Account acc : obj) {
acc.showData();
}
Luồng (Java 8 trở lên) chuyển đổi mảng thành một pipeline, rất tiện dụng cho việc lọc và ánh xạ.pinghoặc tổng hợp mà không cần viết vòng lặp:
import java.util.Arrays;
Arrays.stream(obj)
.filter(acc -> acc.a > 0)
.forEach(Account::showData);
Để đọc hoặc cập nhật một phần tử duy nhất, hãy sử dụng truy cập chỉ mục trực tiếp, ví dụ: obj[1].setData(10, 20)Luôn kiểm tra chiều dài trước khi sử dụng. obj.length tránh ArrayIndexOutOfBoundsExceptionKhi bất kỳ vị trí nào cũng có thể là null, bảo vệ quyền truy cập bằng cách kiểm tra giá trị null hoặc một Optional Để chương trình tiếp tục hoạt động thay vì bị lỗi.
Mảng các đối tượng so với danh sách các đối tượng trong Java
Mảng các đối tượng thông thường thì nhanh và dễ dự đoán, nhưng kích thước cố định của nó sẽ trở thành hạn chế ngay khi số lượng đối tượng thay đổi trong quá trình thực thi. Java'S Khung bộ sưu tập cung cấp ArrayList Như một phương án thay thế năng động. Bảng dưới đây nêu bật thời điểm thích hợp cho mỗi lựa chọn.
| Tính năng | Mảng đối tượng | Danh sách mảng các đối tượng |
|---|---|---|
| Kích thước máy | Đã sửa lỗi khi tạo | Tự động phóng to và thu nhỏ. |
| Tờ khai | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Phần tử truy cập | a[i] | list.get(i) |
| Thêm phần tử | Không được hỗ trợ sau khi tạo. | list.add(obj) |
| Loại an toàn | Được định kiểu tại thời điểm biên dịch bằng khai báo | Các kiểu dữ liệu chung được thực thi tại thời điểm biên dịch |
| HIỆU QUẢ | Đọc dữ liệu được lập chỉ mục nhanh hơn một chút | Cộng O(1) được khấu hao, có một số chi phí phụ cho mỗi phần tử |
| Được ưa thích khi | Kích thước đã biết và cố định. | Kích thước không xác định hoặc thay đổi trong quá trình thực thi. |
Hãy sử dụng mảng khi cần hạn chế về dung lượng bộ nhớ và khả năng lập chỉ mục chính xác, ví dụ như trong bố cục ma trận hoặc các đường dẫn truy cập quan trọng về hiệu năng. ArrayList Trong hầu hết các đoạn mã ứng dụng hàng ngày, khả năng thêm và xóa mà không cần phân bổ lại bộ nhớ vượt trội hơn so với chi phí nhỏ phát sinh trên mỗi phần tử.



