Olhando para diferentes construtores de coleções, a pergunta vem à mente. Por que ArrayList () constrói uma lista vazia com capacidade inicial de dez e ArrayDeque () constrói um deque de matriz vazio com capacidade inicial suficiente para armazenar 16 elementos.
java
collections
Velho Badman Grey
fonte
fonte
Respostas:
Resposta curta
Como a capacidade do ArrayDeque deve ser uma potência de dois e 16 é a menor potência de dois que é pelo menos 10.
O ArrayDeque precisa usar muitas% de operações em todos os lugares para envolver uma matriz linear que finge ser circular.
a % b
pode ser expresso comoa & (b - 1)
seb
fosse uma potência de dois. O AND bit a bit é massivamente mais rápido, portanto a capacidade do ArrayDeque é restrita a poder de dois. Todas as% operações são executadas com máscara de bits em vez de% real na implementação.É também por isso que o HashMap mais recente não usa tamanhos de tabelas de números primos, mas sim dois , novamente porque a operação% precisa ser executada com tanta frequência e pouco a pouco e é muito mais rápida.
Portanto, se a linha de base for 10, as estruturas com potência de duas limitações devem usar 16, pois é a menor potência de duas que é pelo menos 10.
fonte
Não exclua a possibilidade de que não haja motivo específico.
Pode ser que essas duas coleções tenham sido escritas por equipes diferentes. Ambos escolheram um número pequeno como capacidade padrão, mas o primeiro time pensou decimalmente e escolheu 10, enquanto o segundo time pensou em binário e escolheu 16.
fonte
A resposta de @ Esailija é boa para este caso específico.
Mais geralmente, porém, é um trade-off que depende de muitos fatores. Vou dar alguns exemplos:
Como resultado dessas trocas, é compreensível que diferentes implementações de coleta possam ter uma capacidade padrão ideal diferente.
fonte