Maison >Java >javaDidacticiel >Comment utiliser l'initialisation à double accolade en Java
Par hasard, j'ai vu un moyen d'initialiser un objet :
// 新建一个列表,并赋值 "Harry","Tony","Tom" ArrayList<String> friends = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); }};
Bien sûr, la même méthode d'initialisation est également utilisée pour la collection Map :
// 新建一个Map,并赋值 Map<String, Object> cat = new HashMap<String, Object>() {{ put("name", "Tom"); put("age", 10); }};
La syntaxe de classe interne est utilisée ici. Cette méthode est meilleure que de créer d'abord un nouvel objet. puis en l'ajoutant dans l'ordre. Beaucoup plus pratique et concis. Cette méthode est appelée « initialisation à double accolade » (initialisation à double accolade).
Prenons l'initialisation d'ArrayList comme exemple. La première couche d'accolades définit d'abord une classe interne anonyme héritée d'ArrayList
ArrayList<String> friends = new ArrayList<String>() { // 这里什么操作都没有,全部继承自父类(ArrayList) };
La deuxième couche est un bloc de construction d'objet personnalisé (appelé non statique). bloc d'initialisation)
new ArrayList<String>() { // 这里什么操作都没有,全部继承自父类(ArrayList) };
Nous obtenons une instanciation de la sous-classe d'ArrayList via new, puis nous la convertissons en une référence à ArrayList
ArrayList<String> friends = new ArrayList<String>() {{}};
Les amis que nous obtenons sont en fait des références à la sous-classe d'ArrayList, mais il n'y a aucun changement en fonctionnalité
C'est beaucoup plus simple que la méthode standard d'initialisation (mais la lisibilité du code sera relativement mauvaise)
Il est possible d'utiliser des doubles accolades pour initialiser une collection en termes de efficacité Pas aussi bonne que l'étape d'initialisation de la collection standard. La raison en est que l'utilisation de doubles accolades pour l'initialisation entraînera la génération de fichiers de classe internes, et ce processus affectera l'efficacité d'exécution du code.
Vérifiez d'abord les fichiers .class générés par différentes méthodes d'initialisation
Par exemple, le code suivant :
public class Test1 { public static void main(String[] args) { System.out.println(System.currentTimeMillis()); ArrayList<String> list1 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list2 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list3 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list4 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list5 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; …… …snip… …… ArrayList<String> list1000 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; System.out.println(System.currentTimeMillis()); } }
Test1 La liste .class générée après compilation est :
Test1$1.class
Test1$2.class
Test1$3 .class
Test1 $4.class
Test1$5.class
……
…snip…
……
Test1$1000.class
Test1.class
généré 1001 fichiers .class
public class Test2 { public static void main(String[] args) { System.out.println(System.currentTimeMillis()); ArrayList<String> list1 = new ArrayList<>(); list1.add("Harry"); list1.add("Tony"); list1.add("Tom"); list1.add("Jerry"); ArrayList<String> list2 = new ArrayList<>(); list2.add("Harry"); list2.add("Tony"); list2.add("Tom"); list2.add("Jerry"); ArrayList<String> list3 = new ArrayList<>(); list3.add("Harry"); list3.add("Tony"); list3.add("Tom"); list3.add("Jerry"); ArrayList<String> list4 = new ArrayList<>(); list4.add("Harry"); list4.add("Tony"); list4.add("Tom"); list4.add("Jerry"); ArrayList<String> list5 = new ArrayList<>(); list5.add("Harry"); list5.add("Tony"); list5.add("Tom"); list5.add("Jerry"); …… …snip… …… ArrayList<String> list1000 = new ArrayList<>(); list1000.add("Harry"); list1000.add("Tony"); list1000.add("Tom"); list1000.add("Jerry"); System.out.println(System.currentTimeMillis()); } }
Test 2 générés après compilation La liste .class est :
Test2.class
Un seul fichier .class est généré
Temps d'exécution
Le premier code Test1 exécute le résultat
1508379452224
1508379452784
Durée d'exécution : 560 millisecondes
Le résultat d'exécution du deuxième code Test2 :
1508379671505
1508379671507
Le temps d'exécution est de : 2 millisecondes
Bien que cet écart de temps change en fonction des performances de l'ordinateur et de l'état de fonctionnement, il peut également expliquer la double majeure. La méthode d'initialisation par parenthèse prend plus de temps que la méthode conventionnelle
Pour résumer, (lorsque les données d'initialisation du test sont inférieures (la liste n'a pas atteint le point critique d'auto-incrémentation)) la méthode d'initialisation à double accolade est moins efficace que la méthode conventionnelle :
1. Double La méthode d'initialisation par accolade génère plus de fichiers .class que la méthode conventionnelle
2 La méthode d'initialisation par double accolade prend plus de temps à s'exécuter que la méthode conventionnelle
.Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!