2012-02-04 28 views
23

Tôi đang xem nguồn của HashMap.Tại sao bảng băm HashMap được đánh dấu là thoáng qua mặc dù lớp được nối tiếp

A HashMapimplements Serializable.

Ok điều này là để nó có thể được phân biệt/truyền như một đối tượng.

Nhưng tôi thấy rằng chính Hashtable được đánh dấu là transient.

Tôi không nhận được thông tin này.Nếu bạn đánh dấu là tạm thời, điều này có nghĩa là không phải là được đăng theo thứ tự không?

Nhưng tất cả dữ liệu nằm trong bảng. Vậy tại sao lại là transient?

Có lẽ tôi đang bối rối về cách Serializable hoạt động?

Trả lời

31

HashMap sử dụng writeObjectreadObject để triển khai tùy chỉnh tuần tự hóa thay vì chỉ để cho trường của nó được tuần tự hóa bình thường. Nó ghi số lượng các thùng, tổng kích thước và mỗi mục vào luồng và tự xây dựng lại từ các trường đó khi được deserialized. Như tzaman nói, bản thân bảng là không cần thiết ở dạng nối tiếp, vì vậy nó không được tuần tự hóa để tiết kiệm không gian.

Bạn có thể đọc thêm về các phương pháp đó và một số phương pháp khác để thực hiện tùy chỉnh tuần tự hóa (writeReplacereadResolve) trong số Serializable javadoc.

+0

Tôi thấy phương pháp này.Tôi đã tự hỏi tại sao nó làm như vậy? Có lý do gì không? – Cratylus

+9

Mã băm của các đối tượng có thể thay đổi giữa các lần chạy chương trình - ví dụ, nếu hashCode() sử dụng thực thi Object mặc định - vì vậy bảng băm phải được xây dựng lại trong quá trình deserialization. –

11

Từ khóa transient cho biết rằng một trường không được bao gồm trong đại diện được tuần tự hóa của một lớp. Bảng Entry[] của HashMap đơn giản chỉ là cấu trúc tăng tốc - cho phép tra cứu nhanh các mục được lưu trữ. Toàn bộ bảng chính nó không cần phải được tuần tự hóa, chỉ là các mục mà nó chứa, vì bảng có thể được xây dựng lại khi deserializing từ danh sách các mục nhập.

+0

Đây có phải là kích thước hoặc tốc độ không? Vì trong deserialization bạn kết thúc với một bảng có cùng kích thước. – Cratylus

+1

Kích thước. Bảng 'Entry' lớn hơn danh sách các phím. – tzaman

Các vấn đề liên quan