String vs StringBuffer vs StringBuilder

String is een van de meest gebruikte klassen in Java. StringBuffer- en StringBuilder-klassen bieden methoden om strings te manipuleren. We zullen kijken naar het verschil tussen StringBuffer en StringBuilder. StringBuffer vs StringBuilder is een veelvoorkomende vraag tijdens een Java-interview.

String vs StringBuffer vs StringBuilder

String is een van de belangrijkste onderwerpen tijdens een Java-interview. Als je een programma schrijft dat iets op de console afdrukt, gebruik je String. Deze tutorial is gericht op de belangrijkste kenmerken van de String-klasse. Vervolgens zullen we de StringBuffer- en StringBuilder-klassen vergelijken.

String in Java

  1. De String-klasse vertegenwoordigt karakterreeksen, we kunnen String op twee manieren instantiëren.

    String str = "ABC";
    // of 
    String str = new String("ABC");
    
  2. String is onveranderlijk (immutable) in Java. Daarom is het geschikt voor gebruik in een multi-threaded omgeving. We kunnen het delen tussen functies omdat er geen zorgen zijn over inconsistentie van gegevens.

  3. Wanneer we een String maken met dubbele aanhalingstekens, kijkt de JVM eerst naar de String met dezelfde waarde in de string pool. Als het gevonden wordt, retourneert het de referentie van het stringobject uit de pool. Anders maakt het het String-object aan in de String-pool en retourneert de referentie. De JVM bespaart veel geheugen door dezelfde String te gebruiken in verschillende threads.

  4. Als de new-operator wordt gebruikt om een string te maken, wordt deze aangemaakt in het heap-geheugen.

  5. De + operator is overbelast voor String. We kunnen het gebruiken om twee strings te concatenaten. Hoewel het intern StringBuffer gebruikt om deze actie uit te voeren.

  6. String overschrijft equals() en hashCode() methoden. Twee Strings zijn gelijk alleen als ze dezelfde karakterreeks hebben. De equals() methode is hoofdlettergevoelig. Als je op zoek bent naar hoofdletterongevoelige controles, moet je de equalsIgnoreCase() methode gebruiken.

  7. De string maakt gebruik van UTF-16 codering voor de karakterreeks.

  8. String is een definitieve klasse. Alle velden zijn definitief behalve “private int hash”. Dit veld bevat de waarde van de hashCode() functie. De hashcode waarde wordt alleen berekend wanneer de hashCode() methode voor de eerste keer wordt aangeroepen en vervolgens gecached in dit veld. Bovendien wordt de hash gegenereerd met behulp van de definitieve velden van de String klasse met enkele berekeningen. Dus elke keer dat de hashCode() methode wordt aangeroepen, zal dit resulteren in dezelfde uitvoer. Voor de beller lijkt het alsof er elke keer berekeningen plaatsvinden, maar intern wordt het gecached in het hash veld.

String versus StringBuffer

Aangezien String onveranderlijk is in Java, wanneer we String-manipulatie doen zoals concatenatie, substring, enz., genereert het een nieuwe String en verwerpt het de oudere String voor garbage collection. Dit zijn zware bewerkingen en genereren veel afval in de heap. Daarom heeft Java de klassen StringBuffer en StringBuilder geleverd die moeten worden gebruikt voor String-manipulatie. StringBuffer en StringBuilder zijn veranderlijke objecten in Java. Ze bieden append(), insert(), delete() en substring() methoden voor String-manipulatie.

StringBuffer versus StringBuilder

StringBuffer was de enige keuze voor het manipuleren van strings tot Java 1.4. Maar het heeft één nadeel: al zijn openbare methoden zijn gesynchroniseerd. StringBuffer biedt threadveiligheid, maar tegen een prestatiekost. In de meeste scenario’s gebruiken we echter geen String in een multithreaded omgeving. Daarom introduceerde Java 1.5 een nieuwe klasse, StringBuilder, die vergelijkbaar is met StringBuffer behalve voor thread-veiligheid en synchronisatie. StringBuffer heeft enkele extra methoden zoals substring, length, capacity, trimToSize, enz. Deze zijn echter niet nodig, aangezien je al deze ook in String hebt. Daarom zijn deze methoden nooit geïmplementeerd in de StringBuilder-klasse. StringBuffer werd geïntroduceerd in Java 1.0, terwijl de StringBuilder-klasse werd geïntroduceerd in Java 1.5 na het bekijken van de tekortkomingen van StringBuffer. Als je in een single-threaded omgeving bent of geen rekening houdt met thread-veiligheid, moet je StringBuilder gebruiken. Anders moet je StringBuffer gebruiken voor thread-veilige bewerkingen.

StringBuilder versus StringBuffer-prestaties

I am trying to check the effect on performance because of synchronization with a sample program that performs append() on StringBuffer and StringBuilder object for multiple times.

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));
	}
}

I ran the same code for the StringBuffer object also to check the time and memory values. I have executed the code 5 times for each case and then calculated the average values.

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

Het is duidelijk dat StringBuilder zelfs beter presteert dan StringBuffer, zelfs in het geval van een single-threaded omgeving. Dit verschil in prestaties kan worden veroorzaakt door synchronisatie in StringBuffer-methoden.

String vs StringBuffer vs StringBuilder

  1. String is onveranderlijk terwijl StringBuffer en StringBuilder mutabele klassen zijn.
  2. StringBuffer is thread-safe en gesynchroniseerd terwijl StringBuilder dat niet is. Daarom is StringBuilder sneller dan StringBuffer.
  3. De string-concatenatie-operator (+) gebruikt intern de StringBuffer- of StringBuilder-klasse.
  4. Voor stringmanipulaties in een niet-multithreaded omgeving moeten we StringBuilder gebruiken, anders de StringBuffer-klasse.

Dat is alles voor een snelle samenvatting van het verschil tussen String, StringBuffer en StringBuilder. StringBuilder is beter geschikt dan StringBuffer in de meeste algemene programmeerscenario’s. Referenties:

Source:
https://www.digitalocean.com/community/tutorials/string-vs-stringbuffer-vs-stringbuilder