【问题标题】:Is Java "caching" anonymous classes?Java是否“缓存”匿名类?
【发布时间】:2015-09-14 21:11:33
【问题描述】:

考虑以下代码:

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

我只是好奇:)

【问题讨论】:

  • Afaik 匿名类是一个只有生成名称的简单类。而已。与类加载器中的每个类一样执行缓存。
  • 实际上这会产生一个编译器错误:i 不是最终的,这对于作为循环计数器来说是个坏主意。但这是个好问题!

标签: java performance anonymous-class


【解决方案1】:
ArrayList<Integer> currentList = new ArrayList<Integer>() {{
    add(i);
  }};

每次都通过循环创建匿名类的新 instance,而不是每次都重新定义或重新加载该类。类定义一次(编译时),加载一次(运行时)。

使用匿名类不会显着影响性能。

【讨论】:

  • ... 并且在 for 循环之后将无法访问引用“currentList”并再次创建。从这个意义上说,它引用的对象(内部类实例)将立即被标记为垃圾回收。
【解决方案2】:

编译器会将任何匿名类转换为命名的内部类。因此,您的代码将被转换为以下内容:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多