Сводка наиболее распространенных вопросов на собеседовании по Java — неделя 2

Java задняя часть JVM Безопасность

В чем разница между String и StringBuffer и StringBuilder? Почему String неизменяем?

Разница между String и StringBuffer и StringBuilder

изменчивость  Массивы символов используются в классе String:private final char value[]Сохраняет строки, поэтому объекты String неизменяемы. И StringBuilder, и StringBuffer наследуются от класса AbstractStringBuilder.В AbstractStringBuilder массивы символов также используются для сохранения строк, char[]value, оба из которых являются изменяемыми.   

потокобезопасность

Объекты в String являются неизменяемыми, что можно понимать как константы и потокобезопасные. AbstractStringBuilder является общим родительским классом для StringBuilder и StringBuffer и определяет некоторые базовые операции над строками, такие как expandCapacity, append, insert, indexOf и другие общедоступные методы. StringBuffer добавляет блокировку синхронизации к методу или добавляет блокировку синхронизации к вызываемому методу, поэтому он является потокобезопасным. StringBuilder не синхронизирует метод, поэтому он не является потокобезопасным.   

представление

Каждый раз, когда изменяется тип String, создается новый объект String, а затем указатель указывает на новый объект String. Вместо создания новых объектов и изменения ссылок на объекты StringBuffer каждый раз оперирует самим объектом StringBuffer. В той же ситуации использование StirngBuilder может повысить производительность примерно на 10–15 % по сравнению с использованием StringBuffer, но при этом возникает риск небезопасности многопоточности.

Краткое изложение использования трех:

  • Если вы хотите манипулировать небольшим объемом данных, используйте = String
  • Однопоточная работа строковых буферов для обработки больших объемов данных = StringBuilder
  • Многопоточная работа строковых буферов для работы с большими объемами данных = StringBuffer

Почему String неизменяем?

Проще говоря, класс String использует окончательный измененный массив типа char для хранения символов.Исходный код выглядит следующим образом:

    /** The value is used for character storage. */
    private final char value[];

Действительно ли String неизменяем?

Я думаю, если кто-то задаст этот вопрос, ответ неизменен. Вот только два репрезентативных примера:

1) Строка неизменяема, но это не значит, что ссылки нельзя изменить

		String str = "Hello";
		str = str + " World";
		System.out.println("str=" + str);

результат:

str=Hello World

Разобрать:

На самом деле содержимое исходной строки не изменилось, но адрес str был изменен с адреса памяти, изначально указывающего на «Hello», на адрес памяти, указывающий на «Hello World», то есть открывается дополнительная область памяти. для символа «Hello World».string.

2) Можно изменить так называемые «неизменяемые» объекты с помощью отражения.

		// 创建字符串"Hello World", 并赋给引用s
		String s = "Hello World";

		System.out.println("s = " + s); // Hello World

		// 获取String类中的value字段
		Field valueFieldOfString = String.class.getDeclaredField("value");

		// 改变value属性的访问权限
		valueFieldOfString.setAccessible(true);

		// 获取s对象上的value属性的值
		char[] value = (char[]) valueFieldOfString.get(s);

		// 改变value所引用的数组中的第5个字符
		value[5] = '_';

		System.out.println("s = " + s); // Hello_World

результат:

s = Hello World
s = Hello_World

Разобрать:

Используя отражение, вы можете получить доступ к закрытым членам, а затем отразить свойство значения в объекте String, а затем изменить структуру массива через полученную ссылку на значение. Но обычно мы этого не делаем, здесь лишь краткое упоминание об этом.

Каков механизм отражения? Каковы сценарии применения механизма отражения?

Введение в механизм отражения

Механизм отражения JAVA заключается в том, что в рабочем состоянии для любого класса можно знать все свойства и методы этого класса, для любого объекта можно вызывать любые его методы и свойства, это своего рода динамически получаемая информация и динамический вызов Функция метода объекта называется механизмом отражения языка java.

статическая компиляция и динамическая компиляция

  • **Статическая компиляция:** типы определяются во время компиляции, объекты привязываются
  • **Динамическая компиляция:** среда выполнения определяет типы, связывает объекты

Преимущества и недостатки механизма отражения

  • преимущество:Оценка типов во время выполнения, динамическая загрузка классов и повышение гибкости кода.
  • недостаток:Узкое место в производительности: отражение эквивалентно серии операций интерпретации, информирующих JVM о том, что делать, и производительность намного ниже, чем прямой код Java.

Сценарии применения рефлексии

Отражение — это душа дизайна оправы.

В привычном для нас процессе разработки проектов мы редко используем механизм отражения напрямую, но это не значит, что механизм отражения бесполезен.На самом деле многие проекты и разработки связаны с механизмом отражения, например модульная разработка, через отражение. соответствующий байт-код; шаблон проектирования динамического прокси также использует механизм отражения, и такие фреймворки, как Spring/Hibernate, которые мы используем ежедневно, также часто используют механизм отражения.

Например: ① Мы используем Class.forName() для загрузки драйвера базы данных посредством отражения при использовании JDBC для подключения к базе данных ② Spring framework также использует множество механизмов отражения, наиболее классическим из которых является режим конфигурации xml. Процесс загрузки Bean-компонентов Spring через режим конфигурации XML: 1) Загрузите все файлы конфигурации XML или свойств в программе в память; 2) Содержимое в xml или свойства анализируется в классе Java, и получается строка байт-кода соответствующего класса сущности и информация о связанных атрибутах; 3) Механизм отражения используется для получения экземпляра класса определенного класса в соответствии с этим строка; 4) Динамическая настройка свойств экземпляра

Рекомендуемое чтение:

Что такое JDK Что такое JRE? Что такое JVM? Связь и различие между тремя

Это очень простые и базовые вещи в Java, но я считаю, что должно быть много людей, которые не могут в этом разобраться! Зачем? Потому что большую часть времени, когда мы используем готовые инструменты и среды компиляции, мы не учитываем эти вещи.

JDK:Как следует из названия, это набор инструментов разработки, предоставляемый разработчикам, который используется разработчиками программ. Помимо полной JRE (Java Runtime Environment), среды выполнения Java, он также включает в себя другие наборы инструментов для разработчиков.

JRE:Обычным пользователям нужно только установить JRE (Java Runtime Environment) для запуска Java-программ. Разработчики программ должны установить JDK для компиляции и отладки программ.

JVM:Когда мы запускаем программу, JVM отвечает за преобразование байт-кода в определенный машинный код, JVM обеспечивает управление памятью/сборку мусора и механизмы безопасности и т. д. Эта независимость от аппаратного обеспечения и операционной системы является причиной того, что Java-программы могут быть написаны одновременно и выполняться во многих местах.

Отличия и связи:

  1. JDK используется для разработки, а JRE — для запуска Java-программ;
  2. JVM включена как в JDK, так и в JRE;
  3. JVM является ядром языка программирования Java и не зависит от платформы.

Что такое байткод? Какова самая большая выгода от принятия байт-кода?

Сначала посмотрите на компилятор и интерпретатор в java:  

В Java введено понятие виртуальной машины, то есть между машиной и компилируемой программой добавляется абстрактная виртуальная машина. Эта виртуальная машина предоставляет общий интерфейс для компилятора на любой платформе. Компилятору нужно только столкнуться с виртуальной машиной, сгенерировать код, который виртуальная машина может понять, а затем использовать интерпретатор для преобразования кода виртуальной машины в машинный код для конкретной системы для выполнения. В Java этот код, понятный виртуальной машине, называется字节码(т.е. расширение.classфайл), он не нацелен на какой-либо конкретный процессор, а только на виртуальные машины. Интерпретатор для каждой платформы разный, но реализованная виртуальная машина одна и та же. Исходная программа Java компилируется в байт-код после компиляции компилятором.Байт-код интерпретируется и выполняется виртуальной машиной.Виртуальная машина отправляет каждый байт-код для выполнения интерпретатору, и интерпретатор переводит его в машину на определенном машинный код, а затем запустить его на определенной машине. Это также объясняет сосуществование компиляции и интерпретации Java.

Исходный код Java---->компилятор---->байт-код java, исполняемый jvm (т.е. виртуальные инструкции)---->jvm---->интерпретатор в jvm---->machine Исполняемый двоичный машинный код -- --> запуск программы.

Преимущества использования байт-кода:  

Язык Java в определенной степени решает проблему низкой эффективности исполнения традиционных интерпретируемых языков за счет байт-кодов, и в то же время сохраняет характеристики переносимости интерпретируемых языков. Таким образом, Java-программы более эффективны для запуска, а поскольку байт-коды не являются специфическими для конкретной машины, Java-программы могут выполняться на многих разных компьютерах без перекомпиляции.

Разница между Java и С++

Я знаю, что многие люди никогда не изучали C++, но интервьюер просто любит сравнивать нашу Java и C++! ни за что! ! ! Даже если вы не изучали C++, помните об этом!

  • Оба являются объектно-ориентированными языками и оба поддерживают инкапсуляцию, наследование и полиморфизм.
  • Java не предоставляет указатели для прямого доступа к памяти, программная память более безопасна.
  • Классы Java однократно наследуются, а C++ поддерживает множественное наследование; хотя классы Java не могут наследоваться множественно, интерфейсы могут наследоваться множественно.
  • Java имеет механизм автоматического управления памятью, который не требует от программистов ручного освобождения бесполезной памяти.

В чем разница между интерфейсом и абстрактным классом?

  1. Методы интерфейса по умолчанию общедоступны, все методы не могут иметь реализации в интерфейсе, а абстрактные классы могут иметь неабстрактные методы.
  2. Переменные экземпляра в интерфейсах по умолчанию являются окончательными, но не обязательно в абстрактных классах.
  3. Класс может реализовывать несколько интерфейсов, но не более одного абстрактного класса.
  4. Если класс реализует интерфейс, он должен реализовать все методы интерфейса, в то время как абстрактный класс не обязательно
  5. Интерфейс нельзя создать с помощью new, но его можно объявить, но он должен ссылаться на объект, который реализует интерфейс С точки зрения дизайна абстракция — это абстракция класса, шаблона дизайна, а интерфейс — это абстракция поведение, поведенческая спецификация.

В чем разница между переменными-членами и локальными переменными?

  1. С точки зрения синтаксиса, переменные-члены принадлежат классам, а локальные переменные — это переменные, определенные в методах или параметрах методов; переменные-члены могут быть изменены модификаторами, такими как public, private, static и т. д., в то время как локальные переменные недоступны. управляющие модификаторы и статические, однако переменные-члены и локальные переменные могут быть изменены с помощью final;
  2. С точки зрения того, как переменные хранятся в памяти, переменные-члены являются частью объектов, объекты существуют в памяти кучи, а локальные переменные существуют в памяти стека.
  3. С точки зрения времени жизни переменных в памяти переменные-члены являются частью объекта, которые существуют при создании объекта, тогда как локальные переменные автоматически исчезают при вызове метода.
  4. Если переменной-члену не присвоено начальное значение, ей будет автоматически присвоено значение типа по умолчанию (исключение составляет переменная-член, измененная с помощью final, но не измененная с помощью static, должна быть явно назначена); локальные переменные не будут автоматически назначается.

Разница между перегрузкой и переопределением

Перегрузка:Встречается в одном и том же классе, имя метода должно быть таким же, тип параметра другой, номер другой, порядок другой, возвращаемое значение метода и модификатор доступа могут быть разными, и это происходит во время компиляции.  

Переписать:Встречается в родительском и дочернем классах, имя метода и список параметров должны быть одинаковыми, диапазон возвращаемых значений меньше или равен родительскому классу, диапазон генерируемого исключения меньше или равен родительскому классу, а модификатор доступа диапазон больше или равен родительскому классу; если модификатор доступа к методу родительского класса является закрытым, подклассы не могут переопределить этот метод.

Разница между символьными константами и строковыми константами

  1. формальный: Символьная константа — это символ, заключенный в одинарные кавычки. Строковые константы — это несколько символов, заключенных в двойные кавычки.
  2. Значение: Символьная константа эквивалентна целочисленному значению (значение ASCII), которое может участвовать в операциях выражения. Строковая константа представляет значение адреса (где строка хранится в памяти)
  3. Занять объем памяти Символьные константы занимают только один байт Строковые константы занимают несколько байтов (по крайней мере один знак конца символа)

напиши в конце

Рекомендации по документации с открытым исходным кодом

Java-Guide: Java-интервью Таможенное руководство (Руководство по изучению Java). звезда: 1,9к.

Адрес на гитхабе:GitHub.com/snail Climb/…

Позиционирование документа: документ с открытым исходным кодом, специально подготовленный для внутренних инженеров Java.Я считаю, что независимо от того, являетесь ли вы новичком в Java или уже стали инженером Java, вы можете извлечь из этого документа что-то полезное.

Ссылаться на:

сегмент fault.com/ah/119000001…

blog.CSDN.net/День мертвых_38259…

Если ты расцветешь, ветерок придет. Добро пожаловать в мою общедоступную учетную запись WeChat: «Руководство по прохождению интервью на Java», теплую общедоступную учетную запись WeChat. В официальном аккаунте много информации, отвечайте на ключевое слово "1" и может увидите то, что хотите!