Pergunta

Ao criar classes em Java, muitas vezes me pego criando coleções em nível de instância que sei antecipadamente que serão muito pequenas - menos de 10 itens na coleção.Mas não sei o número de itens com antecedência, então normalmente opto por uma coleção dinâmica (ArrayList, Vector, etc).

class Foo
{
  ArrayList<Bar> bars = new ArrayList<Bar>(10);
}

Uma parte de mim continua me incomodando dizendo que é um desperdício usar coleções dinâmicas complexas para algo tão pequeno.Existe uma maneira melhor de implementar algo assim?Ou esta é a norma?

Observe que não fui atingido por nenhuma penalidade de desempenho (perceptível) ou algo parecido.Sou só eu me perguntando se não existe uma maneira melhor de fazer as coisas.

Foi útil?

Solução

O ArrayList classe em Java tem apenas dois membros de dados, uma referência a um Object[] array e um tamanho - que você precisará de qualquer maneira se não usar um ArrayList.Então a única vantagem de não usar um ArrayList está salvando a alocação de um objeto, o que provavelmente nunca será um grande problema.

Se você estiver criando e descartando muitas instâncias de sua classe de contêiner (e, por extensão, de seu ArrayList por exemplo) a cada segundo, você poder tenho um pequeno problema com a rotatividade da coleta de lixo - mas isso é algo com que se preocupar se isso ocorrer.A coleta de lixo normalmente é a menor das suas preocupações.

Outras dicas

Para manter as coisas simples, acho que isso não é problema.Sua implementação é flexível o suficiente para que, se os requisitos mudarem no futuro, você não seja forçado a refatorar.Além disso, não vale a pena adicionar mais lógica ao seu código para uma solução híbrida, levando em consideração seu pequeno conjunto de dados e a alta qualidade da API Collection do Java.

Coleções do Google possui coleções otimizadas para um número imutável/pequeno de elementos.Ver Lists.asList API como exemplo.

A sobrecarga é muito pequena.É possível escrever uma lista de array híbrida que tenha campos para os primeiros itens e depois voltar a usar um array para listas mais longas.

Você pode evitar totalmente a sobrecarga do objeto de lista usando um array.Para ir ainda mais longe, você pode declarar o campo como Object e evitar completamente o array para um único item.

Se a memória realmente for um problema, talvez você queira esquecer o uso de instâncias de objetos em baixo nível.Em vez disso, use uma estrutura de dados maior com um nível maior de granularidade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top