ホームページ  >  記事  >  Java  >  Java で二重中括弧の初期化を使用する方法

Java で二重中括弧の初期化を使用する方法

WBOY
WBOY転載
2023-04-18 11:13:021310ブラウズ

偶然、オブジェクトを初期化する方法を見つけました:

    // 新建一个列表,并赋值 "Harry","Tony","Tom"
    ArrayList<String> friends = new ArrayList<String>() {{
        add("Harry");
        add("Tony");
        add("Tom");
    }};

もちろん、同じ初期化メソッドが Map コレクションにも使用されます:

    // 新建一个Map,并赋值
    Map<String, Object> cat = new HashMap<String, Object>() {{
        put("name", "Tom");
        put("age", 10);
    }};

ここで、内部クラス構文は次のとおりです。この方法は、最初に新しいオブジェクトを追加してから次々に追加するよりもはるかに便利で簡潔です。この方法を「二重括弧初期化」(二重括弧初期化)と呼びます。

このメソッドの理解

ArrayList の初期化を例にとります。中括弧の最初の層では、最初に ArrayList から継承された匿名内部クラスを定義します。

    ArrayList<String> friends = new ArrayList<String>() {
        // 这里什么操作都没有,全部继承自父类(ArrayList)
    };

2 番目の層カスタム オブジェクト構築ブロック (非静的初期化ブロックと呼ばれます)

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

new を通じて ArrayList サブクラスのインスタンス化を取得し、それを ArrayList への参照にアップキャストします

    ArrayList<String> friends = new ArrayList<String>() {{}};
  • 取得したフレンドは実際には ArrayList のサブクラスへの参照ですが、関数には変更はありません

  • 通常の標準的な初期化方法と比較すると、はるかに簡単です(ただし、コードの可読性は比較的低くなります)

効率の問題

二重中括弧を使用してコレクションを初期化すると、標準のコレクションの初期化手順ほど効率的ではない可能性があります。 。その理由は、初期化に二重中括弧を使用すると内部クラス ファイルの生成が発生し、このプロセスがコードの実行効率に影響を与えるためです。

最初に、さまざまな初期化メソッドによって生成された .class ファイルを確認します。

たとえば、次のコード:

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 のコンパイル後に生成される .class リストは次のとおりです:

Test1$1.class
Test1$2.class
Test1$3.class
Test1$4.class
Test1$5.class
……
&hellip ;snip…
... :

Test2.class

生成される .class ファイルは 1 つだけです

実行時間

最初のコード Test1 の実行結果:

1508379452224

1508379452784

実行時間: 560 ミリ秒

2 番目のコードTest2 の実行結果:


1508379671505
1508379671507

#実行時間: 2 ミリ秒

#ただし、この時間の差はコンピューターによって異なります。パフォーマンスや動作状況も説明可能 ダブルブレース初期化方式は従来方式に比べて時間がかかるpoint)) 二重中括弧の初期化方法は、従来の方法よりも効率が低くなります :

1. 二重中括弧の初期化方法は、従来の方法

#2 よりも多くの .class ファイルを生成します。この方法は従来の方法よりも実行に時間がかかります

以上がJava で二重中括弧の初期化を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。