Pull to refresh

Строковые классы Java. Сравнение производительности

Java *
Никогда не задавались вопросом насколько собственно отличается производительность строковых классов Java?

В данном топике я попытался сравнить производительность java.lang классов String, StringBuilder и StringBuffer.
Читать дальше →
Total votes 53: ↑42 and ↓11 +31
Views 34K
Comments 78

Обработка строк в Java. Часть I: String, StringBuffer, StringBuilder

Java *
Sandbox
Tutorial

Вступление


Что вы знаете о обработке строк в Java? Как много этих знаний и насколько они углублены и актуальны? Давайте попробуем вместе со мной разобрать все вопросы, связанные с этой важной, фундаментальной и часто используемой частью языка. Наш маленький гайд будет разбит на две публикации:

  1. String, StringBuffer, StringBuilder (реализация строк)
  2. Pattern, Matcher (регулярные выражения)

Реализация строк на Java представлена тремя основными классами: String, StringBuffer, StringBuilder. Давайте поговорим о них.
Читать дальше →
Total votes 30: ↑21 and ↓9 +12
Views 398K
Comments 68

StringBuffer, и как тяжело избавиться от наследия старого кода

Java *
Всем привет. Эта статья — вольный перевод поста StringBuffer, and how hard it is to get rid of legacy code. Как-то очень он мне запал в душу, поэтому решил перевести. Поехали.

В 2006-м, в 5-й java появился StringBuilder. Более легковесная и разумная альтернатива StringBuffer. Вот, что говорит официальная документация по StringBuffer:

Этот класс дополнен аналогичным классом предназначенным для использования в одном потоке — StringBuilder. В общем случае нужно отдавать предпочтение классу StringBuilder, так как он поддерживает все те же операции, что и этот (StringBuffer), но быстрее, так как не выполняет никаких синхронизаций.

Иметь synchronized в StringBuffer вообще никогда не было хорошей идеей. Основная проблема в том, что одной операции никогда не достаточно. Одиночная конкатенация .append(x) бесполезная без других операций, таких как .append(y) и .toString(). В то время, когда каждый конкретный метод потокобезопасный, вы не можете сделать несколько вызовов без конкуренции между потоками. Ваша единственная опция — внешняя синхронизация.

Так, что? Получается, 10 лет спустя уже никто не использует StringBuffer!? Ну, по крайней мере, точно не для нового функционала!?

Сколько объектов создает этот код?


Как я уже писал раньше, виртуальная машина создает много объектов на старте или при загрузке основных библиотек. Гораздо больше, чем Вы могли бы представить, задавая вопрос выше:

public class Main {
    public static void main(String... args) {
        System.out.println("Hello " + "world");
    }
}

Oracle JVM 8-й версии создает приблизительно 10_000 объектов для выполнения этой программы.
Читать дальше →
Total votes 23: ↑22 and ↓1 +21
Views 13K
Comments 33

Сюрпризы конкатенации

Java *
✏️ Technotext 2021

Вопрос в стиле головоломок с offline-конференций: Что выведет этот код при запуске?


import java.util.concurrent.atomic.AtomicInteger;

public class Disturbed {

    public static void main(String... args) {
        AtomicInteger counter = new AtomicInteger(1);
        System.out.println(
            "First two positive numbers: " +
            counter + 
            ", " +
            counter.incrementAndGet()
        );
    }

}

Помедитируйте немного над кодом и приходите за ответом под кат.

Читать дальше →
Total votes 26: ↑26 and ↓0 +26
Views 5.1K
Comments 6