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 ArrayListcó 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 ArrayListtă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% + 1tới 16. Trên mục thứ 17, ArrayListnó được tăng trở lại 25và 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 ArrayListmà không có hàm tạo kích thước sẽ gọi ArrayList.add 1000000thờ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ừ 10và tăng từng thay đổi kích thước tại 50% + 1. C # bắt đầu 4và 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 1000000bổ sung thêm ví dụ từ trên cho C # sử dụng 3097084hoạt động.
Người giới thiệu