Автор оригинала: Pankaj Kumar.
Строка-один из наиболее широко используемых классов в Java. Классы StringBuffer и StringBuilder предоставляют методы для управления строками. Мы рассмотрим разницу между StringBuffer и StringBuilder. StringBuffer vs StringBuilder – популярный вопрос для интервью на Java.
Строка против StringBuffer против StringBuilder
Строка-одна из самых важных тем в основном интервью java. Если вы пишете программу, которая печатает что-то на консоли, вы используете строку.
Этот учебник направлен на то, чтобы сосредоточиться на основных функциях класса String. Затем мы сравним классы StringBuffer и StringBuilder.
Строка в Java
- Класс String представляет символьные строки, мы можем создать экземпляр String двумя способами.
- Строка неизменна в Java. Поэтому он подходит для использования в многопоточной среде. Мы можем разделить его между функциями, потому что нет никаких опасений о несогласованности данных.
- Когда мы создаем строку с использованием двойных кавычек, JVM сначала ищет строку с тем же значением в пуле строк. Если он найден, он возвращает ссылку на строковый объект из пула. В противном случае он создает объект String в пуле строк и возвращает ссылку. JVM экономит много памяти, используя одну и ту же строку в разных потоках.
- Если для создания строки используется оператор new, она создается в памяти кучи.
- Оператор + перегружен для строки. Мы можем использовать его для объединения двух строк. Хотя внутренне он использует StringBuffer для выполнения этого действия.
- Строка переопределяет методы equals() и hashCode () . Две строки равны только в том случае, если они имеют одинаковую последовательность символов. Метод equals() чувствителен к регистру. Если вы ищете проверки без учета регистра, вам следует использовать метод equalsIgnoreCase ().
- Строка использует кодировку UTF-16 для потока символов.
- Строка-это последний класс. Все поля как окончательные, кроме “private int hash”. Это поле содержит значение функции hashCode (). Значение хэш-кода вычисляется только при первом вызове метода hashCode (), а затем кэшируется в этом поле. Кроме того, хэш генерируется с использованием конечных полей класса String с некоторыми вычислениями. Поэтому каждый раз, когда вызывается метод hashCode (), он приводит к одному и тому же результату. Для вызывающего абонента кажется, что вычисления происходят каждый раз, но внутренне они кэшируются в поле хэша.
Строка против буфера строк
Поскольку строка неизменна в Java, всякий раз, когда мы выполняем манипуляции со строками, такие как объединение, подстрока и т. Д. он генерирует новую строку и отбрасывает старую строку для сбора мусора.
Это тяжелые операции и генерируют много мусора в куче. Таким образом, Java предоставила классы StringBuffer и StringBuilder, которые следует использовать для обработки строк.
StringBuffer и StringBuilder являются изменяемыми объектами в Java. Они предоставляют методы добавления(), вставки(), удаления () и подстроки() для обработки строк.
StringBuffer против StringBuilder
StringBuffer был единственным выбором для обработки строк до Java 1.4. Но у него есть один недостаток, заключающийся в том, что все его общедоступные методы синхронизированы. StringBuffer обеспечивает потокобезопасность, но при снижении производительности.
В большинстве сценариев мы не используем строку в многопоточной среде. Таким образом, Java 1.5 представила новый класс StringBuilder, который похож на StringBuffer, за исключением потокобезопасности и синхронизации.
В StringBuffer есть некоторые дополнительные методы, такие как подстрока, длина, емкость, обрезка и т. Д. Однако они не требуются, так как у вас все это тоже присутствует в строке. Вот почему эти методы никогда не были реализованы в классе StringBuilder.
StringBuffer был представлен в Java 1.0, в то время как класс StringBuilder был представлен в Java 1.5 после рассмотрения недостатков StringBuffer.
Если вы находитесь в однопоточной среде или не заботитесь о безопасности потоков, вам следует использовать StringBuilder. В противном случае используйте StringBuffer для потокобезопасных операций.
Производительность StringBuilder и StringBuffer
Я пытаюсь проверить влияние на производительность из-за синхронизации с образцом программы, которая выполняет append()
для объекта StringBuffer и StringBuilder несколько раз.
package com.journaldev.java; import java.util.GregorianCalendar; public class TestString { public static void main(String[] args) { System.gc(); long start=new GregorianCalendar().getTimeInMillis(); long startMemory=Runtime.getRuntime().freeMemory(); StringBuffer sb = new StringBuffer(); //StringBuilder sb = new StringBuilder(); for(int i = 0; i<10000000; i++){ sb.append(":").append(i); } long end=new GregorianCalendar().getTimeInMillis(); long endMemory=Runtime.getRuntime().freeMemory(); System.out.println("Time Taken:"+(end-start)); System.out.println("Memory used:"+(startMemory-endMemory)); } }
Я запустил тот же код для объекта StringBuffer также для проверки значений времени и памяти. Я выполнил код 5 раз для каждого случая, а затем рассчитал средние значения.
1000000 | 808, 149356704 | 633, 149356704 |
10000000 | 7448, 147783888 | 6179, 147783888 |
Ясно, что StringBuilder работает лучше, чем StringBuffer, даже в случае однопоточной среды. Эта разница в производительности может быть вызвана синхронизацией в методах StringBuffer.
Строка против StringBuffer против StringBuilder
- Строка неизменяема, в то время как StringBuffer и StringBuilder являются изменяемыми классами.
- StringBuffer потокобезопасен и синхронизирован, в то время как StringBuilder-нет. Вот почему StringBuilder работает быстрее, чем StringBuffer.
- Оператор объединения строк (+) внутренне использует класс StringBuffer или StringBuilder.
- Для манипуляций со строками в многопоточной среде мы должны использовать StringBuilder, иначе использовать класс StringBuffer.
Это все для быстрого обобщения различий между String, StringBuffer и StringBuilder. StringBuilder лучше подходит для большинства общих сценариев программирования, чем StringBuffer.
Рекомендации: