Раньше я часто видел дискуссии о сплайсинге Java String и других аспектах в Интернете. Я видел некоторых разработчиков Java в их предложениях начинающим программистам, как следующее:
Не используйте строки сописного знака, чтобы использовать метод Append () StringBuffer или StringBuilder для строк сплайсинга.
Тем не менее, это на самом деле так раздражает струны сплайсинга с + знаками. Есть ли нет ничего хорошего в использовании + знаков для сплайсинговых струн?
Посмотрев некоторый контент о классе строки в документации Java API, мы видим следующий фрагмент:
«Язык Java обеспечивает специальную поддержку символов конкатенации строки («+») и преобразования других объектов в строки. Строка контактенация реализуется через класс StringBuilder (или StringBuffer) и его метод добавления. Преобразование строки реализуется с помощью метода ToString, который определяется классом объекта и может быть унаследован всеми классами в Java».
Этот отрывок ясно говорит нам, что в Java использование строк сплайсинга + Sign фактически реализовано StringBuffer или StringBuilder и его методом добавления.
В дополнение к документации Java API, мы также можем использовать инструмент для просмотра команды Bytecode файла класса, чтобы получить вышеуказанный ответ. Например, код:
public static void main (string [] args) {string a = "hello"; Строка b = "World"; String str = a + b + "!"; System.out.println (str);} Команда для просмотра соответствующего байт -кода через инструмент следующая:
Из команды ByteCode мы можем ясно видеть, что следующий код, который мы написали
String str = a + b + "!";
Он был преобразован в утверждение, аналогичное следующему:
String str = new StringBuilder (string.valueof (a)). Приложение (b) .append ("!"). ToString ();Мало того, компилятор Java также является относительно умным компилятором. Когда сплайсинг знака + является литералом строки, компилятор Java разумно преобразует его в полную строку во время компиляции. Например:
public static void main (string [] args) {string str = "hello" + "world" + ", java!"; System.out.println (str);} Компилятор Java напрямую расщепляет такую строку, которая является буквальной и преобразует ее в полную строку при составлении.
Даже если в строке сплайсированные знаки есть переменные, компилятор Java объединит литералы передней строки в одну строку.
public static void main (string [] args) {string java = ", java!"; String str = "hello" + "мир" + java; System.out.println (str);}Из вышесказанного видно, что для такой операции, как String Str = Str1 + Str2 + Str3 + Str4, нет проблем с сплайсингом нескольких строк за один раз.
В Java объекты строки неизменны (неизменные). В коде вы можете создать несколько псевдонимов для определенного строкового объекта. Но ссылки этих псевдонимов одинаковы.
Например, S1 и S2 являются псевдонимом для объектов "droidyue.com", а псевдоним хранятся в ссылках на реальный объект. Итак, S1 = S2
String s1 = "droidyue.com"; string s2 = s1; system.out.println ("s1 и s2 имеет одинаковую ссылку =" + (s1 == s2));А в Java единственный перегруженный оператор связан с сплайсингом строк. +,+=. Кроме того, дизайнеры Java не позволяют перегружать других операторов.
В Java единственный перегруженный оператор связан с сплайсингом строк. +,+=. Кроме того, дизайнеры Java не позволяют перегружать других операторов.
Как мы все знаем, перед Java 1.4 можно было бы использовать строки струйки для сплайсинга струн. Начиная с Java 1.5, мы можем использовать StringBuilder для струн сплайсинга. Основное различие между StringBuffer и StringBuilder состоит в том, что StringBuffer безопасен для потока и подходит для многопоточной работы строк; StringBuilder безопасен для потока и подходит для эксплуатационных строк под одним потоком. Тем не менее, большинство наших операций по сшиванию строчек выполняются под одним потоком, поэтому использование StringBuilder полезно для производительности.
Перед Java 1.4 компилятор использовал StringBuffer для обработки строк с + сплайсированным знаком; Начиная с Java 1.5, компилятор использовал stringBuilder для обработки строк с + сплайсированными строками.
Когда мы пишем код в среде JDK 1.4, рекомендуется использовать знак + для борьбы с вышеупомянутой ситуацией, когда несколько строк сплачиваются одновременно. Таким образом, когда JDK обновлен до 1,5 и выше, компилятор автоматически преобразует его в StringBuilder в строки сплайсинга, тем самым повышая эффективность сплайсинга строк.
Конечно, рекомендуемое использование строк сплайсинга + знака ограничено только использованием только при сплайсинге нескольких строк в утверждении. Если вы разбиваете строку в нескольких операторах, по -прежнему рекомендуется использовать StringBuffer или StringBuilder. Например:
public static void main (string [] args) {string java = ", java!"; String str = ""; str += "Привет"; str += "World"; str += java; System.out.println (str);} Скомпилированные команды байта компилятора следующие:
На рисунке выше мы можем знать, что каждый оператор сплайсинга + знак создает новый объект StringBuilder. Эта ситуация особенно очевидна в условиях цикла, что приводит к относительно большим потери эффективности. Поэтому настоятельно рекомендуется использовать StringBuffer или StringBuilder для обработки строк в нескольких операторах.
О оптимизации, вызванной с помощью StringBuilder
Кроме того, при использовании StringBuffer или StringBuilder мы также можем использовать следующий метод для дальнейшего повышения производительности (следующий код принимает StringBuilder в качестве примера, StringBuffer аналогичен этому).
1. Прогнозируйте максимальную длину конечной полученной строки.
Длина по умолчанию массива char внутри StringBuilder составляет 16. Когда мы добавляем строку и превышаем эту длину, StringBuilder расширит емкость внутреннего массива для удовлетворения потребностей. В этом процессе StringBuilder создает новый, более крупный массив емкости и копирует данные из исходного массива в новый массив. Если мы можем примерно предсказать максимальную длину строки, которая наконец -то сплачивается, мы можем указать начальную емкость соответствующего размера при создании объекта StringBuilder. Например, нам нужно сплачивать, чтобы получить строку, содержащую 100 букв a. Вы можете написать следующий код:
StringBuilder SB = New StringBuilder (100); for (int i = 0; i <100; i ++) {sb.append ('a');} system.out.println (sb);Пожалуйста, сбалансируйте в соответствии с фактическими условиями, чтобы создать StringBuilder, подходящий для начальной емкости.
2. Для отдельных символов используйте тип Char, а не тип строки как можно больше.
Иногда нам нужно добавить один символ после строки (например: а), и мы должны использовать его как можно больше в настоящее время.
SB.Append ('a');Вместо использования:
sb.append ("a");