java - for循环中创建对象
迷茫
迷茫 2017-04-17 17:42:37
0
11
1607

下面这两种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中的内容有影响吗,还是只是性能上有区别?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

répondre à tous(11)
迷茫

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

Peter_Zhu
list<User> users = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
    users.add(new User().setUserId(i).setUserName("segment" + i));
}
左手右手慢动作

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal