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

Comment utiliser l'initialisation à double accolade en Java

WBOY
Libérer: 2023-04-18 11:13:02
avant
1363 Les gens l'ont consulté

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");
    }};
Copier après la connexion

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);
    }};
Copier après la connexion

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)
    };
Copier après la connexion

La deuxième couche est un bloc de construction d'objet personnalisé (appelé non statique). bloc d'initialisation)

    new ArrayList<String>() {
        // 这里什么操作都没有,全部继承自父类(ArrayList)
    };
Copier après la connexion

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>() {{}};
Copier après la connexion
  • 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());
    }
}
Copier après la connexion

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());
    }
}
Copier après la connexion

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal