10

次のコードを検討してください。

for(int i = 0;i < 200;i++)
{
  ArrayList<Integer> currentList = new ArrayList<Integer>() {{
    add(i);
  }};
  // do something with currentList
}
  • Javaはのクラスをどのように扱いcurrentListますか?
  • 200個のオブジェクトごとに異なるクラスと見なされますか?
  • 最初のオブジェクトが作成された後でも、パフォーマンスが低下しますか?
  • どういうわけかそれをキャッシュしていますか?

私はただ興味があります:)

4

2 に答える 2

15
ArrayList<Integer> currentList = new ArrayList<Integer>() {{
    add(i);
  }};

ループのたびに匿名クラスの新しいインスタンスを作成していますが、毎回クラスを再定義または再ロードしているわけではありません。クラスは 1 回定義され (コンパイル時)、1 回ロードされます (実行時)。

匿名クラスを使用しても、パフォーマンスが大幅に低下することはありません。

于 2010-01-12T17:10:31.900 に答える
15

コンパイラは、匿名クラスを名前付き内部クラスに変換します。したがって、コードは次の行に沿って何かに変換されます。

class OuterClass$1 extends ArrayList<Integer> {
    OuterClass$1(int i) {
      super();
      add(i);
    }
}

for (int i = 0; i < 200; i++) {
    ArrayList<Integer> currentList = new OuterClass$1(i);
}
于 2010-01-12T17:11:16.220 に答える