Поиск по сайту:

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


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

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

Строка — одна из самых важных тем в основном интервью по Java. Если вы пишете программу, которая что-то выводит на консоль, вы используете String. Этот учебник направлен на то, чтобы сосредоточиться на основных функциях класса String. Затем мы сравним классы StringBuffer и StringBuilder.

Строка в Java

  1. String class represents character strings, we can instantiate String in two ways.

    String str = "ABC";
    // or 
    String str = new String("ABC");
    
  2. String is immutable in Java. So it’s suitable to use in a multi-threaded environment. We can share it across functions because there is no concern of data inconsistency.

  3. When we create a String using double quotes, JVM first looks for the String with the same value in the string pool. If found, it returns the reference of the string object from the pool. Otherwise, it creates the String object in the String pool and returns the reference. JVM saves a lot of memory by using the same String in different threads.

  4. If the new operator is used to create a string, it gets created in the heap memory.

  5. The + operator is overloaded for String. We can use it to concatenate two strings. Although internally it uses StringBuffer to perform this action.

  6. String overrides equals() and hashCode() methods. Two Strings are equal only if they have the same character sequence. The equals() method is case sensitive. If you are looking for case insensitive checks, you should use equalsIgnoreCase() method.

  7. The string uses UTF-16 encoding for the character stream.

  8. String is a final class. All the fields as final except “private int hash”. This field contains the hashCode() function value. The hashcode value is calculated only when the hashCode() method is called for the first time and then cached in this field. Furthermore, the hash is generated using the final fields of String class with some calculations. So every time the hashCode() method is called, it will result in the same output. For the caller, it seems like calculations are happening every time but internally it’s cached in the hash field.

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

Поскольку String неизменяема в Java, всякий раз, когда мы выполняем манипуляции со строками, такие как конкатенация, подстрока и т. д., она генерирует новую строку и отбрасывает старую строку для сборки мусора. Это тяжелые операции, которые генерируют много мусора в куче. Таким образом, Java предоставляет классы StringBuffer и StringBuilder, которые следует использовать для манипуляций со строками. StringBuffer и StringBuilder — изменяемые объекты в Java. Они предоставляют методы append(), insert(), delete() и substring() для манипуляций со строками.

StringBuffer против StringBuilder

StringBuffer был единственным выбором для манипуляций со строками до Java 1.4. Но у него есть один недостаток: все его общедоступные методы синхронизированы. StringBuffer обеспечивает безопасность потоков, но за счет снижения производительности. В большинстве сценариев мы не используем String в многопоточной среде. Поэтому в Java 1.5 появился новый класс StringBuilder, который похож на StringBuffer, за исключением обеспечения безопасности потоков и синхронизации. StringBuffer имеет некоторые дополнительные методы, такие как подстрока, длина, емкость, trimToSize и т. д. Однако они не требуются, поскольку все они присутствуют и в String. Вот почему эти методы никогда не были реализованы в классе 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 раз для каждого случая, а затем вычислил средние значения.

Value of i StringBuffer (Time, Memory) StringBuilder (Time, Memory)
10,00,000 808, 149356704 633, 149356704
1,00,00,000 7448, 147783888 6179, 147783888

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

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

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

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

  • Документ по строковому API
  • Документация по API StringBuffer
  • Документация по API StringBuilder