Java是否“缓存”匿名类?

时间:2010-01-12 17:06:20

标签: java performance anonymous-class

请考虑以下代码:

for(int i = 0;i < 200;i++)
{
  ArrayList<Integer> currentList = new ArrayList<Integer>() {{
    add(i);
  }};
  // do something with currentList
}
  • Java如何处理currentList的类?
  • 它会认为200个对象中的每一个都是不同的类吗?
  • 即使创建了第一个对象,它也会受到影响吗?
  • 是否以某种方式缓存它?

我只是好奇:)

2 个答案:

答案 0 :(得分:15)

ArrayList<Integer> currentList = new ArrayList<Integer>() {{
    add(i);
  }};
每次通过循环时,

都会创建匿名类的新实例,而不是每次都重新定义或重新加载类。该类定义一次(在编译时),并加载一次(在运行时)。

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

答案 1 :(得分: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);
}