Pergunta rápida sobre primitivas
Pergunta
Editou esta pergunta por causa dos meus maus exemplos. Aqui está minha pergunta atualizada:
O seguinte seria igual em velocidade e alocação de memória:
int b;
for (int i = 0; i < 1000; i++)
b = i;
e
for (int i = 0; i < 1000; i++)
int b = i;
Solução
Não, não seria.
No primeiro caso, você tem uma variável atribuída 1000 valores diferentes - e acaba sendo capaz de obter o último valor (999) após a conclusão do construtor.
No segundo caso, você está chamando de um método essencialmente não-o-operatório de 1000 vezes. O segundo método não tem efeitos colaterais e não tem valor de retorno, por isso é inútil. A variável local somente "existe" durante a duração da chamada do método, enquanto a variável de instância no primeiro exemplo faz parte do objeto, portanto viverá.
Observe que isso não é restrito a primitivas - qualquer outro tipo se comportaria da mesma maneira.
Outras dicas
- Sim. Ambos são totalmente inúteis.
- Não. O tamanho da instância da classe1 é maior que o tamanho da instância da classe2, devido à variável do membro.
A resposta depende do que você quer dizer dizendo "igual" =)
Não.
- Dentro
Class1
a variávela
é um campo, acessível por todos os métodos da classe. - Dentro
Class2
Este não é o caso:a
é uma variável local dentro do métodoassign
. Depoisassign
acabamentos, o valor dea
é descartado.
Não, um tem uma variável de instância a
(Classe1), e um não.
Na primeira instância, você já declarou B como um INT e seu valor é atualizado sempre que o loop é executado. No segundo, B é declarado e inicializado com o valor de I cada vez que o loop é executado. Não tenho 100% de certeza, mas acho que o segundo caso é mais intensivo em memória, mas não acho que a diferença de velocidade seja perceptível.
Vale a pena notar que qualquer compilador que valha seu sal, e eu acredito firmemente que o JIT valha muito sal, apenas reservaria espaço para "B" uma vez no segundo caso, ou seja, a fase de 'declaração' seria sem sentido.
Você já experimentou isso? Nem sequer compila!
for (int i = 0; i < 1000; i++)
int b = i;
Mensagens de erro do compilador:
Example.java:4: '.class' expected
int b = i;
^
Example.java:4: not a statement
int b = i;
^
Example.java:4: illegal start of expression
int b = i;
^
O corpo de um loop deve conter pelo menos uma declaração. Uma declaração variável não é uma declaração; portanto, um loop com apenas uma declaração variável é inválida.