Tại sao các bộ sưu tập java khác nhau có dung lượng mặc định khác nhau?


11

Nhìn vào các nhà xây dựng bộ sưu tập khác nhau, câu hỏi xuất hiện trong tâm trí. Tại sao ArrayList () xây dựng một danh sách trống với dung lượng ban đầu là mười và ArrayDeque () xây dựng một deque mảng trống với dung lượng ban đầu đủ để chứa 16 phần tử.


Tôi không mới có giới hạn năng lực. Tôi chỉ đơn giản là thêm các phần tử mới với add (). Nó luôn hoạt động.
Tulains Córdova

1
Tôi nghĩ rằng anh ta đang nói về kích thước mảng ban đầu của mảng bên trong triển khai ArrayList. Như tên của nó, ArrayList chỉ là một mảng cũ đơn giản và nó tự động tạo ra các mảng lớn hơn khi bạn cố gắng thêm nhiều phần tử hơn kích thước mảng hiện tại của nó.
dsw88

1
Tôi nghĩ StringBuilder là một công cụ khác có dung lượng mặc định, là 10 hay 16?
Ingo

@Ingo Thú vị. Tôi thậm chí không nhận ra những thứ bên ngoài bộ sưu tập bị rối tung với năng lực nhưng tôi cho rằng nó có ý nghĩa. Vào thời điểm đó, không có thẻ cho dung lượng nên tôi không hứng thú với việc sử dụng khác.
Old Badman Grey

Câu trả lời:


17

Câu trả lời ngắn

Bởi vì công suất ArrayDeque phải là lũy thừa của hai và 16 là công suất nhỏ nhất của hai ít nhất là 10.


ArrayDeque cần sử dụng rất nhiều hoạt động% ở khắp mọi nơi để bao quanh một mảng tuyến tính giả vờ là hình tròn.

a % bcó thể được thể hiện như a & (b - 1) thể b là một sức mạnh của hai. Bitwise AND nhanh hơn rất nhiều nên khả năng của ArrayDeque bị hạn chế là sức mạnh của hai. Tất cả các hoạt động% được thực hiện với bitmasking thay vì% thực tế trong quá trình thực hiện.

Đây cũng là lý do tại sao HashMap mới hơn không sử dụng kích thước bảng số nguyên tố, nhưng sức mạnh của hai , một lần nữa bởi vì hoạt động% cần phải được thực hiện thường xuyên và bitwise và nhanh hơn nhiều.

Vì vậy, nếu đường cơ sở là 10, thì các cấu trúc có sức mạnh ở hai giới hạn nên sử dụng 16 bởi vì đó là sức mạnh nhỏ nhất trong hai, ít nhất là 10.


3

Không loại trừ khả năng là không có lý do cụ thể.

Có thể là hai bộ sưu tập này đã được viết bởi các đội khác nhau. Cả hai đều chọn một số nhỏ làm công suất mặc định, nhưng đội thứ nhất nghĩ một cách dứt khoát và chọn 10, trong khi nhóm thứ hai nghĩ nhị phân và chọn 16.


1

Câu trả lời của @ Esailija là tốt cho trường hợp cụ thể này.

Nói chung, đó là một sự đánh đổi phụ thuộc vào nhiều yếu tố. Tôi sẽ đưa ra một vài ví dụ:

  • Cấu trúc dữ liệu thường được sử dụng như thế nào? Các cấu trúc dữ liệu được sử dụng làm bộ đệm dữ liệu thường thích dung lượng cao hơn nhiều so với cấu trúc dữ liệu được sử dụng cho các bộ dữ liệu nhỏ, chẳng hạn.
  • Kích thước mặc định của dữ liệu phù hợp với một dòng bộ đệm trên nền tảng CPU mục tiêu của bạn? Nó có thể tạo ra sự khác biệt lớn đối với hiệu suất nếu mặc định phù hợp với dòng bộ đệm. Lựa chọn 10 là mặc định trong Java cũng có thể là do một mảng gồm 10 từ 32 bit cộng với chi phí mảng / đối tượng phù hợp trong một dòng bộ đệm 64 byte.
  • Bao nhiêu bạn đánh giá không gian so với hiệu quả thời gian chạy ? Nếu bạn muốn hiệu năng thời gian chạy tốt hơn, thường thì tốt hơn là phân bổ trước nhiều không gian hơn để tránh phân bổ lại sau này.

Do sự đánh đổi này, điều khá dễ hiểu là các triển khai bộ sưu tập khác nhau có thể có công suất mặc định tối ưu khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.