Sobes.tech
Junior

Jaké jsou rozdíly mezi StringBuilder a StringBuffer v Java?

sobes.tech AI

Odpověď od AI

Hlavní rozdíl je v tom, že StringBuffer je vlákno bezpečný, zatímco StringBuilder ne.

  • StringBuffer: Všechny jeho metody jsou synchronizované (synchronized). To zajišťuje bezpečnost při práci s více vlákny současně, zajišťujíc, že pouze jedno vlákno může vykonat metodu v daném okamžiku. To však také snižuje výkon kvůli nákladům na synchronizaci.

  • StringBuilder: Metody nejsou synchronizované. To ho činí rychlejším než StringBuffer v prostředí s jedním vláknem. Při použití StringBuilder z více vláken bez vnější synchronizace mohou nastat nesprávné výsledky, protože operace se mohou prolínat.

Kdy používat:

  • Používejte StringBuilder v jednovláknových aplikacích nebo když je bezpečnost vláken zajištěna na vyšší úrovni. Je rychlejší.
  • Používejte StringBuffer ve vícevláknových aplikacích, kde může více vláken současně upravovat stejný objekt, a potřebujete vestavěnou bezpečnost vláken.

Příklad:

// StringBuilder v prostředí s jedním vláknem (preferováno)
StringBuilder sb = new StringBuilder();
sb.append("Ahoj").append(" ").append("Svět");
System.out.println(sb.toString()); // Vytiskne "Ahoj Svět"

// StringBuffer v prostředí s více vlákny (bezpečnější při současném přístupu)
StringBuffer sbf = new StringBuffer();
// V reálném vícevláknovém scénáři budou vlákna přistupovat ke sbf
sbf.append("Vlákno ").append(Thread.currentThread().getId());
System.out.println(sbf.toString()); // Vytiskne něco jako "Vlákno 1" nebo "Vlákno 2" v závislosti na vláknu