Sobes.tech
Junior

Aké sú rozdiely medzi StringBuilder a StringBuffer v Jave?

sobes.tech AI

Odpoveď od AI

Hlavný rozdiel je v tom, že StringBuffer je vlákno bezpečný, zatiaľ čo StringBuilder nie je.

  • StringBuffer: Všetky jeho metódy sú synchronizované (synchronized). To zabezpečuje bezpečnosť pri práci s viacerými vláknami súčasne, zaručujúc, že iba jedno vlákno môže vykonať metódu v danom momente. To však tiež vedie k zníženiu výkonu kvôli nákladom na synchronizáciu.

  • StringBuilder: Metódy nie sú synchronizované. To ho robí rýchlejším ako StringBuffer v prostredí s jedným vláknom. Pri použití viacerými vláknami bez vonkajšej synchronizácie môžu nastať nesprávne výsledky, pretože operácie sa môžu prekrývať.

Kedy použiť:

  • Použite StringBuilder v jednovláknových aplikáciách alebo keď je bezpečnosť vlákien zabezpečená na vyššej úrovni. Je rýchlejší.
  • Použite StringBuffer v viacvláknových aplikáciách, kde viacero vlákien môže súčasne upravovať ten istý objekt, a potrebujete zabudovanú bezpečnosť vlákien.

Príklad:

// StringBuilder v prostredí s jedným vláknom (preferované)
StringBuilder sb = new StringBuilder();
sb.append("Ahoj").append(" ").append("svet");
System.out.println(sb.toString()); // Vytlačí "Ahoj svet"

// StringBuffer v prostredí s viacerými vláknami (bezpečnejšie pri súčasnom prístupe)
StringBuffer sbf = new StringBuffer();
// V reálnom viacvláknovom scenári budú vlákna pristupovať k sbf
sbf.append("Vláknо ").append(Thread.currentThread().getId());
System.out.println(sbf.toString()); // Vytlačí niečo ako "Vláknо 1" alebo "Vláknо 2" v závislosti od vlákna