Java是否"缓存"匿名类?

Geo*_*Geo 10 java performance anonymous-class

请考虑以下代码:

for(int i = 0;i < 200;i++)
{
  ArrayList<Integer> currentList = new ArrayList<Integer>() {{
    add(i);
  }};
  // do something with currentList
}
Run Code Online (Sandbox Code Playgroud)
  • Java将如何对待这类currentList
  • 对于200个对象中的每一个,它会认为它是一个不同的类吗?
  • 即使在创建第一个对象后,它是否会受到性能影响?
  • 是以某种方式缓存吗?

我只是好奇 :)

ska*_*man 15

ArrayList<Integer> currentList = new ArrayList<Integer>() {{
    add(i);
  }};
Run Code Online (Sandbox Code Playgroud)

每次通过循环创建匿名类的新实例时,它不是每次都重新定义或重新加载类.该类定义一次(在编译时),并加载一次(在运行时).

使用匿名类没有显着的性能损失.

  • ...并且在for循环之后将无法访问引用"currentList"并再次创建.在这种意义上,它引用的对象(内部类实例)将立即标记为垃圾收集. (2认同)

not*_*oop 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);
}
Run Code Online (Sandbox Code Playgroud)