Maison > Questions et réponses > le corps du texte
下面这两种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中的内容有影响吗,还是只是性能上有区别?
迷茫2017-04-17 17:44:37
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.
巴扎黑2017-04-17 17:44:37
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
天蓬老师2017-04-17 17:44:37
list<User> users = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
users.add(new User().setUserId(i).setUserName("segment" + i));
}
黄舟2017-04-17 17:44:37
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é.
迷茫2017-04-17 17:44:37
Il semble que la première méthode crée un objet supplémentaire et le reste n'a aucun effet
PHP中文网2017-04-17 17:44:37
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
PHP中文网2017-04-17 17:44:37
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
迷茫2017-04-17 17:44:37
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.