Я считаю, что этот вопрос знаком каждому однокласснику, изучающему 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.
Некоторые общие мнемонические значения инструкций:
- нет, ничего не делать.
- aconst_null, поместите значение null на вершину стека.
- iconst_i (номер переменной), поместите тип int i на вершину стека. Аналогично есть lconst_0, fconst_0, вы должны знать, что это значит
- LDC, выталкивает значения int, float или string констант из пула констант наверх.
- Iload толкает указанную локальную переменную int в верхнюю часть стека.
- istore, сохраните верхнее целочисленное значение стека в указанной локальной переменной. Точно так же astore_i представляет собой сохранение ссылочного значения на вершине стека в i-ю локальную переменную.
- dup, скопируйте значение на вершину стека и поместите скопированное значение на вершину стека.
- invokevirtual, вызывает метод экземпляра.
- invokespecial, вызывает конструктор суперкласса, метод инициализации экземпляра и закрытый метод.
- invokestatic, вызывает статический метод.
- InvokeInterface, вызов метода интерфейса.
- invokedynamic, вызывает динамически связанный метод.
- new, создает объект и помещает его ссылочное значение на вершину стека.
Суммировать
Сколько объектов было создано?
-
Если xyz не существует, ссылка считается объектом, то есть 3
-
Если xyz не существует, ссылка не считается объектом, это 2
-
Если есть XYZ, ссылочный счет объекта, именно два
-
Если XYZ существует, ссылка не является объектом, то есть 1
Конечно, я думаю, что цитирование определенно не считается объектом, окончательный ответ должен быть 1 или 2. Честно говоря, этот вопрос интервью не должен фигурировать в основном вопросе интервью.
Кроме того, если вы не понимаете инструкции по декомпилированию байт-кода, следуйте официальной учетной записи, чтобы ответить на ключевое слово 111, чтобы получить электронную книгу «Спецификация виртуальной машины Java».