Рубрики
Без рубрики

Классы StringBuffer и StringBuilder используются для управления строками в Java. Узнайте о разнице между объектами stringbuffer и stringbuilder.

Классы StringBuffer и StringBuilder используются для управления строками в Java. Узнайте о разнице между объектами stringbuffer и stringbuilder.

Автор оригинала: Pankaj Kumar.

Строка-один из наиболее широко используемых классов в Java. Классы StringBuffer и StringBuilder предоставляют методы для управления строками. Мы рассмотрим разницу между StringBuffer и StringBuilder. StringBuffer vs StringBuilder – популярный вопрос для интервью на Java.

Строка против StringBuffer против StringBuilder

Строка-одна из самых важных тем в основном интервью java. Если вы пишете программу, которая печатает что-то на консоли, вы используете строку.

Этот учебник направлен на то, чтобы сосредоточиться на основных функциях класса String. Затем мы сравним классы StringBuffer и StringBuilder.

Строка в Java

  1. Класс String представляет символьные строки, мы можем создать экземпляр String двумя способами.
  2. Строка неизменна в Java. Поэтому он подходит для использования в многопоточной среде. Мы можем разделить его между функциями, потому что нет никаких опасений о несогласованности данных.
  3. Когда мы создаем строку с использованием двойных кавычек, JVM сначала ищет строку с тем же значением в пуле строк. Если он найден, он возвращает ссылку на строковый объект из пула. В противном случае он создает объект String в пуле строк и возвращает ссылку. JVM экономит много памяти, используя одну и ту же строку в разных потоках.
  4. Если для создания строки используется оператор new, она создается в памяти кучи.
  5. Оператор + перегружен для строки. Мы можем использовать его для объединения двух строк. Хотя внутренне он использует StringBuffer для выполнения этого действия.
  6. Строка переопределяет методы equals() и hashCode () . Две строки равны только в том случае, если они имеют одинаковую последовательность символов. Метод equals() чувствителен к регистру. Если вы ищете проверки без учета регистра, вам следует использовать метод equalsIgnoreCase ().
  7. Строка использует кодировку UTF-16 для потока символов.
  8. Строка-это последний класс. Все поля как окончательные, кроме “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

  1. Строка неизменяема, в то время как StringBuffer и StringBuilder являются изменяемыми классами.
  2. StringBuffer потокобезопасен и синхронизирован, в то время как StringBuilder-нет. Вот почему StringBuilder работает быстрее, чем StringBuffer.
  3. Оператор объединения строк (+) внутренне использует класс StringBuffer или StringBuilder.
  4. Для манипуляций со строками в многопоточной среде мы должны использовать StringBuilder, иначе использовать класс StringBuffer.

Это все для быстрого обобщения различий между String, StringBuffer и StringBuilder. StringBuilder лучше подходит для большинства общих сценариев программирования, чем StringBuffer.

Рекомендации: