Maison  >  Article  >  Java  >  Comment utiliser l'initialisation à double accolade en Java

Comment utiliser l'initialisation à double accolade en Java

WBOY
WBOYavant
2023-04-18 11:13:021260parcourir

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).

Compréhension de cette méthode

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)

Problèmes d'efficacité

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer