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;
Foi útil?

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ável a é 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étodo assign. Depois assign acabamentos, o valor de a é 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.

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