В чем разница между 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-программы могут быть написаны одновременно и выполняться во многих местах.
Отличия и связи:
- JDK используется для разработки, а JRE — для запуска Java-программ;
- JVM включена как в JDK, так и в JRE;
- 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 имеет механизм автоматического управления памятью, который не требует от программистов ручного освобождения бесполезной памяти.
В чем разница между интерфейсом и абстрактным классом?
- Методы интерфейса по умолчанию общедоступны, все методы не могут иметь реализации в интерфейсе, а абстрактные классы могут иметь неабстрактные методы.
- Переменные экземпляра в интерфейсах по умолчанию являются окончательными, но не обязательно в абстрактных классах.
- Класс может реализовывать несколько интерфейсов, но не более одного абстрактного класса.
- Если класс реализует интерфейс, он должен реализовать все методы интерфейса, в то время как абстрактный класс не обязательно
- Интерфейс нельзя создать с помощью new, но его можно объявить, но он должен ссылаться на объект, который реализует интерфейс С точки зрения дизайна абстракция — это абстракция класса, шаблона дизайна, а интерфейс — это абстракция поведение, поведенческая спецификация.
В чем разница между переменными-членами и локальными переменными?
- С точки зрения синтаксиса, переменные-члены принадлежат классам, а локальные переменные — это переменные, определенные в методах или параметрах методов; переменные-члены могут быть изменены модификаторами, такими как public, private, static и т. д., в то время как локальные переменные недоступны. управляющие модификаторы и статические, однако переменные-члены и локальные переменные могут быть изменены с помощью final;
- С точки зрения того, как переменные хранятся в памяти, переменные-члены являются частью объектов, объекты существуют в памяти кучи, а локальные переменные существуют в памяти стека.
- С точки зрения времени жизни переменных в памяти переменные-члены являются частью объекта, которые существуют при создании объекта, тогда как локальные переменные автоматически исчезают при вызове метода.
- Если переменной-члену не присвоено начальное значение, ей будет автоматически присвоено значение типа по умолчанию (исключение составляет переменная-член, измененная с помощью final, но не измененная с помощью static, должна быть явно назначена); локальные переменные не будут автоматически назначается.
Разница между перегрузкой и переопределением
Перегрузка:Встречается в одном и том же классе, имя метода должно быть таким же, тип параметра другой, номер другой, порядок другой, возвращаемое значение метода и модификатор доступа могут быть разными, и это происходит во время компиляции.
Переписать:Встречается в родительском и дочернем классах, имя метода и список параметров должны быть одинаковыми, диапазон возвращаемых значений меньше или равен родительскому классу, диапазон генерируемого исключения меньше или равен родительскому классу, а модификатор доступа диапазон больше или равен родительскому классу; если модификатор доступа к методу родительского класса является закрытым, подклассы не могут переопределить этот метод.
Разница между символьными константами и строковыми константами
- формальный: Символьная константа — это символ, заключенный в одинарные кавычки. Строковые константы — это несколько символов, заключенных в двойные кавычки.
- Значение: Символьная константа эквивалентна целочисленному значению (значение ASCII), которое может участвовать в операциях выражения. Строковая константа представляет значение адреса (где строка хранится в памяти)
- Занять объем памяти Символьные константы занимают только один байт Строковые константы занимают несколько байтов (по крайней мере один знак конца символа)
напиши в конце
Рекомендации по документации с открытым исходным кодом
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" и может увидите то, что хотите!