После 10 лет работы посмотрите, сколько объектов создает String s = new String("xyz")?

Java
После 10 лет работы посмотрите, сколько объектов создает String s = new String("xyz")?

Я считаю, что этот вопрос знаком каждому однокласснику, изучающему Java. Как классический вопрос для собеседования, я действительно думаю, что это охуенный вопрос после стольких лет работы. Вы все еще можете увидеть, как многие люди обсуждают этот вопрос в Интернете. Многие из них которые работали много лет дискутировали, и я думаю, что нужно говорить об этом вопросе.

из области метода

Константный пул существует в области методов, и область методов сильно изменилась до и после версии jdk1.7, поэтому давайте сначала поговорим об эволюции области методов.

До версии jdk1.7 постоянный пул существовал в области методов, которая была логической частью кучи и имела имянекуча.

Версия 1.7 поместила пул строковых констант в кучу.

После версии 1.8 постоянная генерация была удалена, концепция области методов сохранена, реализация области методов изменена на метапространство, а пул констант по-прежнему находился в куче.

Причина изменения области метода заключается в том, что следующее содержимое статьи не будет отличаться из-за версии JDK, а следующее содержимое будет обсуждаться на основе версии jdk1.8.

String s = new String("xyz");

Начнем с куска кода

public class Test {
    public static void main(String[] args) {
        String s = "xyz";
    }
}

Затем мы javac компилируем код, затем используем javap для декомпиляции, выполняем javap -c Test

Судя по результатам, команда ldcСоздал объект «xyz» в пуле констант и поместил его на вершину стека операндов., а затем сохраните astore в локальную переменную и верните ее.

Затем посмотрите на код во втором вопросе интервью.

public class Test {
    public static void main(String[] args) {
        String s = new String("xyz");
    }
}

Тот же анализ декомпиляции

Очевидно, мы видим, что new создает объект String, а ldc создает строковый объект «xyz» в пуле констант, а затем invokespecial выполняет конструктор, присваивает astore_1 и возвращает значение.

Из приведенных выше двух примеров вы можете узнать, что String s = new String("xyz"); создает 2 объекта, и в некоторых ответах говорится, что 3 объекта ссылаются на ссылку s как на объект.

Также есть ответ о том, что создаются 2 xyz, если они существуют, и 3 (включая reference s), если они не существуют.Проверим еще раз.

public class Test {
    public static void main(String[] args) {
        String s = "xyz";
        String s2 = new String("xyz");
    }
}

Отсюда очевидно, что это комбинация наших примеров 1 и 2, но обратите внимание на **#2** после двух ldc, знак # представляет собой индекс, указывающий, что вторая новая строка("xyz ") время не воссоздает объект xyz.

Некоторые общие мнемонические значения инструкций:

  1. нет, ничего не делать.
  2. aconst_null, поместите значение null на вершину стека.
  3. iconst_i (номер переменной), поместите тип int i на вершину стека. Аналогично есть lconst_0, fconst_0, вы должны знать, что это значит
  4. LDC, выталкивает значения int, float или string констант из пула констант наверх.
  5. Iload толкает указанную локальную переменную int в верхнюю часть стека.
  6. istore, сохраните верхнее целочисленное значение стека в указанной локальной переменной. Точно так же astore_i представляет собой сохранение ссылочного значения на вершине стека в i-ю локальную переменную.
  7. dup, скопируйте значение на вершину стека и поместите скопированное значение на вершину стека.
  8. invokevirtual, вызывает метод экземпляра.
  9. invokespecial, вызывает конструктор суперкласса, метод инициализации экземпляра и закрытый метод.
  10. invokestatic, вызывает статический метод.
  11. InvokeInterface, вызов метода интерфейса.
  12. invokedynamic, вызывает динамически связанный метод.
  13. new, создает объект и помещает его ссылочное значение на вершину стека.

Суммировать

Сколько объектов было создано?

  1. Если xyz не существует, ссылка считается объектом, то есть 3

  2. Если xyz не существует, ссылка не считается объектом, это 2

  3. Если есть XYZ, ссылочный счет объекта, именно два

  4. Если XYZ существует, ссылка не является объектом, то есть 1

Конечно, я думаю, что цитирование определенно не считается объектом, окончательный ответ должен быть 1 или 2. Честно говоря, этот вопрос интервью не должен фигурировать в основном вопросе интервью.

Кроме того, если вы не понимаете инструкции по декомпилированию байт-кода, следуйте официальной учетной записи, чтобы ответить на ключевое слово 111, чтобы получить электронную книгу «Спецификация виртуальной машины Java».