Tôi thực sự đã viết một bài blog về chủ đề này 2 tháng trước. Bài viết dành cho C # List<T>
nhưng Java ArrayList
có cách triển khai rất giống nhau. TừArrayList
được thực hiện bằng cách sử dụng một mảng động, nó tăng kích thước theo yêu cầu. Vì vậy, lý do cho các nhà xây dựng năng lực là cho mục đích tối ưu hóa.
Khi một trong các hoạt động nối lại này xảy ra, ArrayList sẽ sao chép nội dung của mảng thành một mảng mới có dung lượng gấp đôi dung lượng cũ. Hoạt động này chạy trong O (n) thời gian .
Thí dụ
Dưới đây là một ví dụ về cách ArrayList
tăng kích thước:
10
16
25
38
58
... 17 resizes ...
198578
297868
446803
670205
1005308
Vì vậy, trong danh sách bắt đầu với một công suất 10
, khi mục 11 được thêm vào đó là tăng 50% + 1
tới 16
. Trên mục thứ 17, ArrayList
nó được tăng trở lại 25
và cứ thế. Bây giờ hãy xem xét ví dụ nơi chúng tôi đang tạo một danh sách nơi khả năng mong muốn đã được biết đến là 1000000
. Tạo ArrayList
mà không có hàm tạo kích thước sẽ gọi ArrayList.add
1000000
thời gian sẽ mất O (1) bình thường hoặc O (n) khi thay đổi kích thước.
1000000 + 16 + 25 + ... + 670205 + 1005308 = 4015851 hoạt động
So sánh điều này bằng cách sử dụng hàm tạo và sau đó gọi hàm ArrayList.add
được đảm bảo để chạy trong O (1) .
1000000 + 1000000 = 2000000 hoạt động
Java vs C #
Java là như trên, bắt đầu từ 10
và tăng từng thay đổi kích thước tại 50% + 1
. C # bắt đầu 4
và tăng mạnh hơn nhiều, tăng gấp đôi ở mỗi lần thay đổi kích thước. Các 1000000
bổ sung thêm ví dụ từ trên cho C # sử dụng 3097084
hoạt động.
Người giới thiệu