rod.attack:
é claro que na primeira versão um novo objeto é criado a cada iteração. E na segunda versão somente um objeto é criado.
Porém, na primeira versão, assim que o objeto é criado e executa seu método, ele já se torna elegível para o GC.
Na segunda versão, o mesmo objeto é mantido durante todo o escopo do método.
Qual a melhor abordagem?
Em termos de performance, tanto faz. Use a que for mais lógica para você.
Engano, seu. Serão criados vários objetos, mas utilizando apenas um único espaço de memória.
O que ocorre é que o garbage collector controla gerações de objetos. Existe a geraçãode objetos “novos” que ficam numa área de memória rápida e facilmente reutilizável. E a geração de objetos “velhos”, que vão para um local mais definitivo.
Quando esse objeto é morto, ele não é imediatamente coletado, pois ainda está na área nova. Quando vc faz um novo new, aquela área de memória será reutilizada, sem custo de uma nova alocação, ou sem gastar nova memória. O java apenas rodará uma função nativa do SO para zerar aquela região, e em seguida o construtor, o que geralmente tem um custo ridiculamente barato.
Quem quiser saber mais:
Essa é uma das características que ajudam a tornar aplicações Java tão performáticas quanto aplicações C++, embora exista o overhead da VM.