Przyglądając się różnym konstruktorom kolekcji, pojawia się pytanie. Dlaczego ArrayList () konstruuje pustą listę o początkowej pojemności dziesięciu, a ArrayDeque () konstruuje pustą tablicę deque o początkowej pojemności wystarczającej do przechowywania 16 elementów.
java
collections
Stary Badman Gray
źródło
źródło
Odpowiedzi:
Krótka odpowiedź
Ponieważ pojemność ArrayDeque musi być potęgą dwóch, a 16 to najmniejsza potęga dwóch, czyli co najmniej 10.
ArrayDeque musi używać wszędzie wielu operacji%, aby owinąć tablicę liniową, która udaje, że jest okrągła.
a % b
można wyrazić tak,a & (b - 1)
jakbyb
była potęgą dwóch. Bitowe AND jest znacznie szybsze, więc pojemność ArrayDeque jest ograniczona do potęgi dwóch. Wszystkie operacje% są wykonywane z maskowaniem bitów zamiast rzeczywistego% w implementacji.Z tego też powodu nowszy HashMap nie używa rozmiarów tabeli liczb pierwszych, lecz potęgę dwóch , ponieważ operacja% musi być wykonywana tak często i bitowo i jest o wiele szybsza.
Więc jeśli linia bazowa to 10, to struktury, które mają moc dwóch ograniczeń, powinny użyć 16, ponieważ jest to najmniejsza potęga dwóch, co najmniej 10.
źródło
Nie wykluczaj możliwości, że nie ma konkretnego powodu.
Możliwe, że te dwie kolekcje zostały napisane przez różne zespoły. Obaj wybrali niewielką liczbę jako domyślną pojemność, ale pierwsza drużyna pomyślała dziesiętnie i wybiera 10, podczas gdy druga drużyna myślała binarnie i wybiera 16.
źródło
Odpowiedź @ Esailija jest dobra w tym konkretnym przypadku.
Mówiąc bardziej ogólnie, jest to kompromis, który zależy od wielu czynników. Podam kilka przykładów:
W wyniku tych kompromisów zrozumiałe jest, że różne implementacje kolekcji mogą mieć inną optymalną domyślną pojemność.
źródło