Является ли Java "кешированием" анонимных классов?

Рассмотрим следующий код:

for(int i = 0;i < 200;i++)
{
  ArrayList<Integer> currentList = new ArrayList<Integer>() {{
    add(i);
  }};
  // do something with currentList
}
  • Как Java обрабатывает класс currentList?
  • Будет ли он рассматривать этот класс для каждого из 200 объектов?
  • Будет ли это поражение производительности даже после создания первого объекта?
  • Это кеширование каким-то образом?

Мне просто интересно:)

Ответ 1

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

каждый раз создает новый экземпляр анонимного класса через ваш цикл, он не переопределяет и не перезагружает класс каждый раз. Класс определяется один раз (во время компиляции) и загружается один раз (во время выполнения).

При использовании анонимных классов не наблюдается значительного повышения производительности.

Ответ 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);
}