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.

  • 📦 Lưu trữ tham chiếu: Mỗi vị trí trong Java Mảng các đối tượng chứa tham chiếu đến một đối tượng, chứ không phải chính đối tượng đó, tương tự như bất kỳ biến đối tượng nào trong Java.
  • 🧱 Quy trình tạo lập gồm hai bước: Cấp phát mảng bằng new ClassName[size], sau đó cấp phát từng đối tượng bằng new ClassName() trước khi gọi các phương thức trên đó.
  • ⚠️ NullPointerNgoại lệ: Mọi vị trí (slot) đều bắt đầu với giá trị null. Việc gọi một phương thức trên một vị trí chưa được khởi tạo sẽ gây ra lỗi NullPointerException khi chạy chương trình.
  • 🔁 Lặp lại: Sử dụng vòng lặp for với độ dài mảng hoặc vòng lặp for nâng cao để duyệt qua từng phần tử trong mảng.
  • 📏 Kích thước cố định: Mảng không thể tự mở rộng sau khi đã cấp phát. Hãy sử dụng ArrayList khi số lượng đối tượng thay đổi trong quá trình thực thi.
  • 🏗️ Khởi tạo hàm tạo: Các hàm tạo được truyền trực tiếp trong quá trình tạo giúp thiết lập ngắn gọn và an toàn hơn so với các lệnh gọi setter được thực thi sau đó.
  • 🚚 Tham số phương thức: Việc truyền mảng vào một phương thức sẽ truyền một tham chiếu, do đó những thay đổi bên trong phương thức sẽ hiển thị cho bên gọi.

Mảng đối tượng trong Java

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.

Java Mảng các biến tham chiếu đối tượng

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]obj[1]Mảng giờ đây chứa các tham chiếu thực sự và mã chạy trơn tru.

Java Mảng các đối tượng đã được điền dữ liệu

Đầ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.

  1. 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.
  2. 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.
  3. 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ăngMảng đối tượngDanh sách mảng các đối tượng
Kích thước máyĐã sửa lỗi khi tạoTự động phóng to và thu nhỏ.
Tờ khaiAccount[] a = new Account[5];List<Account> list = new ArrayList<>();
Phần tử truy cậpa[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áoCá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útCộng O(1) được khấu hao, có một số chi phí phụ cho mỗi phần tử
Được ưa thích khiKí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ử.

Câu Hỏi Thường Gặp

Một mảng các đối tượng trong Java Đây là một vùng chứa có kích thước cố định, lưu trữ các tham chiếu đến các thể hiện của cùng một lớp. Mỗi vị trí trỏ đến một đối tượng trên heap, và các phần tử được truy cập bằng chỉ mục dựa trên 0 bằng cách sử dụng dấu ngoặc vuông.

Khai báo mảng với ClassName[] arr = new ClassName[size], sau đó tạo từng đối tượng bằng new ClassName() trong một vòng lặp hoặc bằng cú pháp mảng nội tuyến. Cả hai bước đều cần thiết; bước đầu tiên chỉ cấp phát các vị trí tham chiếu.

Vì new ClassName[size] chỉ cấp phát chính mảng đó. Mỗi vị trí (slot) ban đầu đều là null, do đó việc gọi bất kỳ phương thức nào trên vị trí đó sẽ gây ra lỗi NullPointerException. Khắc phục bằng cách gán một ClassName() mới cho mỗi chỉ mục trước khi sử dụng.

Mảng có kích thước cố định được chọn khi tạo, trong khi ArrayList tự động mở rộng và thu hẹp. Mảng cung cấp khả năng đọc dữ liệu theo chỉ mục nhanh hơn một chút; ArrayList bổ sung các phương thức thêm, xóa và truyền dữ liệu tiện lợi cho mã ứng dụng hàng ngày.

Sử dụng vòng lặp for cổ điển với arr.length khi bạn cần chỉ mục, hoặc vòng lặp for-each nâng cao để lặp đơn giản. Để lọc hoặc biến đổi, hãy bao bọc mảng bằng Arrays.stream(arr) và nối chuỗi đường dẫn bạn cần.

Khai báo tham số là ClassName[] name, sau đó gọi phương thức với biến mảng. Java Phương thức này truyền tham chiếu mảng theo giá trị, do đó các thay đổi đối với các trường phần tử bên trong phương thức sẽ hiển thị cho người gọi.

Các trình tạo mã máy học nhận biết mô hình phân bổ hai bước và hoàn thiện các dòng `new ClassName()` bị thiếu mà người mới bắt đầu thường quên. Chúng cũng đề xuất `ArrayList` khi kích thước tập hợp mục tiêu không xác định, giúp giảm lỗi `NullPointerException`.

Đúng vậy. GitHub Copilot tạo ra các khai báo mảng, vòng lặp khởi tạo, khối lặp và chuyển đổi ArrayList từ một bình luận mô tả mô hình miền. Review đã tạo mã để kiểm tra các đối số hàm tạo chính xác và xử lý giá trị null an toàn trước khi sử dụng.

Tóm tắt bài viết này với: