2010-01-12 79 views
10

考虑下面的代码:Java是“缓存”匿名类吗?

for(int i = 0;i < 200;i++) 
{ 
    ArrayList<Integer> currentList = new ArrayList<Integer>() {{ 
    add(i); 
    }}; 
    // do something with currentList 
} 
  • 将如何处理的Java类的currentList
  • 对于200个物体中的每一个,它会认为它是不同的类吗?
  • 即使在第一个对象被创建后它会是性能问题吗?
  • 它以某种方式缓存它吗?

我只是好奇:)

+3

Afaik匿名类是一个简单的类,只有一个生成的名称。而已。缓存与类加载器中的每个类一样执行。 – ZeissS 2010-01-12 17:10:06

+0

实际上这会产生一个编译器错误:'我'不是最终的,这对于循环计数器来说是个坏主意。但一个很好的问题! – 2010-01-12 19:10:43

回答

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

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

使用匿名类没有显着的性能影响。

+2

...并且引用“currentList”在for循环后将无法访问并再次创建。在这个意义上,它引用的对象(内部类实例)将被立即标记为垃圾收集。 – OscarRyz 2010-01-12 17:25:26

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); 
}