Pergunta

Na verdade aqui é um tema semelhante com pouco valor prático. Tanto quanto eu entendo, primitivas de um melhor desempenho e deve ser usado em todos os lugares, exceto para os casos em que são necessários recursos objeto-relacionado (por exemplo null de verificação). Certo?

Foi útil?

Solução

Não se esqueça que, desde a criação de uma nova embalagem para cada ocorrência de boxe é muito caro, especialmente considerando que geralmente sendo usado em um único escopo de um método, autoboxing utiliza um conjunto de wrappers comuns.

Esta é de facto uma implementação do flyweight padrão de design . Quando um boxe ocorre para um valor bem conhecido, em vez de criar uma nova instância invólucro, uma instância pré-criado é obtido a partir de uma piscina e retornado.

Uma das consequências é: está ainda não recomendável usar autoboxing para cálculos científicos . Por exemplo, o código de d = a * b + c é o uso de classes inteiros para a, b, c, d, e o código gerado é d.valueOf (a.intValue () * b.intValue () + c.intValue ( )). Todas essas chamadas de método têm a sua própria sobrecarga, então é geralmente recomendado para uso autoboxing quando necessário para armazenar primitivos em coleções .

E mesmo assim, se você tem uma enorme coleção de Integer embrulho int, a lata sobrecarga implica tempos de execução mais longos, até 20 vezes mais , como relatado neste artigo .


Jb acrescenta este importante comentário:

Além disso Wrapper.valueOf (primitivos) usos pool de wrappers. Então, preferem Integer.valueOf (5) a nova Integer (5)

Outras dicas

Primitives são mais rápidos quando são usado , como objetos precisam ser unboxed antes de usar; portanto, há uma etapa extra para o VM para executar. Por exemplo, para realizar operações aritméticas em um Integer, ele deve primeiro ser convertidos para um int antes da aritmética pode ser realizada.

Em muitos aplicativos de negócios que provavelmente raramente importa. Mas se você estivesse escrevendo algo muito numnber esmaga-pesado como, digamos, um processador gráfico transformação você é muito mais provável que cuidados.

Sim, primitivos são mais rápidos do que objetos. Desde Java 5, você pode até mesmo misturar primitivos e objetos sem converter manualmente um para outro. O mecanismo autoboxing cuida de exatamente isso.

Isto significa que se você colocar um primitivo em uma coleção, o compilador não vai reclamar, e converter o primitivo a um objeto implicitamente.

Se você precisa armazenar primitivos em coleções que você pode usar commons-primitivos .

Eu prefiro usar primitivas para wrappers, único lugar que absolutamente precisa ter wrappers são classes de entidade. Bancos de dados suportam valores nulos, então entidades deve também.

Uma vez eu trabalhei no projeto que primitivos usados ??(e ORM homebrew) no acesso de banco de dados:

 class Foo{
    int xxx = -1;
 ...
 }

E então você teve:

 void persist(Foo foo){
     ...
     statement.setInt(15,foo.getXXX()==-1?null:foo.getXXX());
     ...
}

a Deus foi mal.

Eu diria que você deveria estar preocupado sobre o uso de primitivas sobre wrappers apenas quando o perfil do seu aplicativo e ver que o autoboxing é um problema de desempenho ou memória. Na minha memória a experiência se torna um problema antes de ciclos de CPU quando se fala de primitivas vs objetos de embrulho.

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