下面这两种for循环中新建对象写法有什么区别呢?
第一种:
list<User> users = new ArrayList<User>();
User user = null;
for (int i = 0; i < 10; i++) {
user = new User();
user.setUserId(i);
user.setUserName("segment" + i);
users.add(user);
}
……
第二种:
list<User> users = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setUserId(i);
user.setUserName("segment" + i);
users.add(user);
}
……
这两种写法对集合users中的内容有影响吗,还是只是性能上有区别?
Il n'y a aucun impact, seule la portée de la variable utilisateur est différente.
Si vous devez faire un traitement spécial sur la dernière valeur de la boucle, utilisez la première forme sinon, je pense que la deuxième forme est meilleure.
Un nouvel objet est créé à chaque boucle, et chaque objet est différent. Il n'y a aucune différence entre les deux manières d'écrire
Tout va bien. Aucune différence
Personnellement, il ne semble y avoir aucune différence..
Peut-être que le premier a de meilleures performances, mais ce n'est pas du tout un problème que les programmeurs Java considèrent intuitivement, le second a de meilleures normes de codage et une meilleure lisibilité.
Il semble que la première méthode crée un objet supplémentaire et le reste n'a aucun effet
N'oubliez pas un principe : les variables doivent être déclarées et créées uniquement en cas de besoin. Donc : le deuxième, mais la différence est petite. Les étudiants qui disent qu'il y a une différence d'efficacité espèrent avoir des données pour le soutenir et le montrer à tout le monde
Le contenu n'a aucun impact. C'est le premier type Une fois la boucle for terminée, l'utilisateur pointe toujours un morceau de mémoire qui ne sera pas recyclé par le garbage collector
En gros, aucune différence. La seule différence est que le timing d'ajustement du compteur de référence est légèrement différent, mais l'objet est toujours référencé et même le GC ne sera pas déclenché. Donc celui-ci ne fait vraiment aucune différence.
Pour les objets déclarés dans le corps de la boucle, le marquage de l'objet libérera la référence une fois la portée terminée. Cependant, si elle est déclarée en dehors de la boucle, la référence précédente ne sera libérée qu'à la prochaine affectation. Même s'il n'est pas enregistré par le conteneur, sous le mécanisme GC de JAVA, il n'y a pas beaucoup de différence. L'objet ne sera pas libéré avant le prochain voyage GC.
Compte tenu de la lisibilité du code, les objets ne doivent être utilisés que dans le corps de la boucle et ne doivent pas être déclarés à l'extérieur. Lorsque la portée est grande et la complexité du code est élevée, il est facile de commettre des erreurs.
Toujours le même principe : créer quand il le faut.