2012-03-24 27 views
19

Tôi đã đọc nguồn gốc của ArrayList Java và tôi đi qua tuyên bố mảng hậu thuẫn của nó:Tại sao ArrayList sử dụng bộ nhớ tạm thời?

private transient Object[] elementData; 

Tại sao điều này cần phải được thoáng qua? Tại sao lớp này không thể được tuần tự hóa?

Cảm ơn sự giúp đỡ!

Trả lời

23

có thể được đăng theo thứ tự; lớp ArrayList chỉ tự chăm sóc mọi thứ, thay vì sử dụng cơ chế mặc định. Nhìn vào các phương pháp writeObject()readObject() trong lớp đó, là một phần của cơ chế tuần tự tiêu chuẩn.

Nếu bạn nhìn vào nguồn, bạn thấy rằng writeObject() không lưu mảng sao lưu. Thay vào đó, nó sẽ tuần tự hóa các phần tử (bao gồm cả các giá trị null) một lần tại một giới hạn lên đến giới hạn size(). Điều này tránh các chi phí đầu vào của việc tuần tự hóa mảng, và đặc biệt là các khe không sử dụng ở cuối mảng. Khi hủy tuần tự hóa, mảng sao lưu mới có kích thước yêu cầu tối thiểu được tạo bởi readObject().

5

Tại sao điều này cần phải tạm thời?

Nó thực hiện điều này vì nó cung cấp các phương thức tùy chỉnh readObjectwriteObject làm công việc tuần tự hóa tốt hơn mặc định. Cụ thể, phương thức writeObject chỉ viết kích thước và chuỗi các phần tử. Điều này tránh tuần tự hóa đối tượng mảng riêng mà 1) có đầu trang và chi phí của riêng nó và 2) thường được đệm với null s. Tiết kiệm không gian có thể đáng kể.

(Trong thực tế, tôi không nghĩ rằng lĩnh vực này nghiêm cần được khai báo là transient ở tất cả, nhưng nó sẽ giúp ghi lại mục đích của các nhà phát triển.)

Tại sao có thể' t lớp này được đăng theo thứ tự?

Toàn bộ lớp học ArrayList có thể được nối tiếp . Các Object[] có thể được đăng, nhưng họ đã chọn để thực hiện nó một cách khác.


1 - Thực ra, điều này phụ thuộc vào loại thời gian chạy của các phần tử. Ví dụ: nếu bạn cố gắng tuần tự hóa một tham chiếu ArrayList chứa tham chiếu Thread, thì bạn sẽ nhận được ngoại lệ thời gian chạy cho tham chiếu không null đầu tiên.

1

Bởi vì nó thực hiện tuần tự hóa rõ ràng. Xem ArrayList # writeObject.

3

ArrayList thực hiện Serializable, vì vậy nó thể được tuần tự, đó là chính xác lý do tại sao các mảng ủng hộ tư nhân là transient, vì vậy nó không được đăng cùng với dữ liệu khác trong lớp, vì tất cả được xử lý bởi ArrayList 's writeObjectreadObject phương pháp.

1

Biến không serializable

  • Nếu biến là không serializable, sau đó cơ chế serialization sẽ ném một ngoại lệ khi nó cố gắng để serialize biến. Để tránh điều này, bạn có thể khai báo biến là tạm thời.

Biến là không cần thiết

  • Giả sử trường hợp lưu trữ kết quả của một tính toán. Tại địa phương, chúng tôi có thể muốn để lưu trữ kết quả tính toán, để tiết kiệm thời gian xử lý. Nhưng khi chúng tôi gửi đối tượng qua dây, chúng tôi có thể lo lắng nhiều hơn về việc tiêu thụ băng thông và do đó loại bỏ tính toán được lưu trong bộ nhớ cache vì chúng tôi luôn có thể tạo lại nó sau này.

liên kết: http://onjava.com/pub/a/onjava/excerpt/JavaRMI_10/index.html?page=3