Java: fill the gaps
Привет! Меня зовут Диана, и я занимаюсь разработкой с 2013. Здесь пишу просто и понятно про джава бэк 🔥Тот самый курс по многопочке🔥 https://fillthegaps.ru/mt Комплименты, вопросы, предложения: @utki_letyat
Ko'proq ko'rsatish📈 Telegram kanali Java: fill the gaps analitikasi
Java: fill the gaps (@java_fillthegaps) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 12 549 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 10 121-o'rinni va Rossiya mintaqasida 52 862-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 12 549 obunachiga ega bo‘ldi.
07 Iyun, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -46 ga, so‘nggi 24 soatda esa 0 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 34.72% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining N/A% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 0 marta ko‘riladi; birinchi sutkada odatda 0 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 0 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent redis, hashmap, linkedhashmap, индекс, фича kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Привет! Меня зовут Диана, и я занимаюсь разработкой с 2013. Здесь пишу просто и понятно про джава бэк
🔥Тот самый курс по многопочке🔥
https://fillthegaps.ru/mt
Комплименты, вопросы, предложения: @utki_letyat”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 08 Iyun, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
String s = s1 + s2 + s3;Для него компилятор java 8 соберёт байткод:
// Method StringBuilder."(init)":() // Method StringBuilder.append:(String) // Method StringBuilder.append:(String) // Method StringBuilder.append:(String) // Method StringBuilder.toString:()Компилятор java 9 сделает по-другому:
invokedynamic #13По ссылкам мы придём в метод StringConcatFactory#makeConcatWithConstants (Подробно про invokedynamic я писала в этом посте, сейчас не будем углубляться) В классе StringConcatFactory лежит та же логика со стринг билдером. Но очень параметризуемая: через JVM параметры доступны немного разные реализации и стратегии вычисления исходного размера StringBuilder. Это слишком глубокие дебри, поэтому не буду расписывать подробно. Почитать про все опции и посмотреть бенчмарки можно тут. У любой задачи есть цель, поэтому давайте разберёмся, зачем это всё затевалось. Первый вариант, приходящий на ум - увеличение производительности. Но по бенчмаркам видно, что перенос логики из байткода в java код не увеличил скорость работы. Второй вариант - большая гибкость. Да, параметров стало больше, но не думаю, что это будет востребовано в большинстве проектов. Основная цель изменений - это "причёсывание" кода. Что получилось после рефакторинга: ✅ Логичность. Я воспринимаю + как сокращённую форму метода add для строк и ожидаю реализацию этого метода внутри JDK. ✅ Чёткое разделение обязанностей. Работа компилятора - преобразовать конструкции языка в инструкции для JVM. Например, превратить + в вызов метода. Оптимизации на этом уровне могут быть, но не на уровне "бизнес-логики". Соединить две строчки на этапе компиляции - это одно. Прописать создание объектов и тд - совсем другое. ✅ Легче сделать сложную логику обработки. В классе StringConcatFactory 900 строк с кучей параметров и проверок. Представляете, если такое будет в байткоде? Написал в коде плюсик, а при компиляции получил чудовище. ✅ Легче менять реализацию. Для изменения конкатенации в будущем достаточно поменять код в JDK, и не нужно трогать компилятор. Это снижает количество работы и возможных ошибок. Если совсем просто, то перенос логики соединения строк из байткода в JDK - это как перенос логики из хранимых процедур в основной код🙂
"a"+"b", то проблемы нет.
Но в типичном java приложении очень много строчек и их взаимодействий. Больше строк - больше промежуточных объектов. Если не принять специальных мер, то "a"+"b"+"c"+"d" приведёт к созданию ab, abc и abcd.
Строки иногда занимают половину памяти, поэтому оптимизация очень важна.
StringBuilder - специальный класс, который снижает накладные расходы при соединении строк. Выглядит это так:
StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b");
sb.append("c");
String res = sb.toString();
Что происходит: StringBuilder выделяет байтовый массив и с каждым append добавляет туда строчки. При вызове toString из этого массива создаётся неизменяемая строка. Так количество лишних объектов существенно сокращается.
Единственный минус StringBuilder - плохая читаемость. Половину кода занимает append.
Через + работать приятнее, поэтому у компилятора есть набор оптимизаций при использовании плюсика. Что делает компилятор:
🔸 Соединяет явно обозначенные строки:
String s = "a" + "b" + "c";
Сразу компилируется в abc.
🔸 Сразу соединяет final строки:
final String s1 = "a";
final String s2 = "b";
final String s3 = "с";
String s4 = s1 + s2 + s3;
Это тоже компилируется в abc, без промежуточных объектов.
🔸 Если строки НЕ final, то код выше компилируется в создание объекта StringBuilder, 3 вызова метода append и метод toString
Тут мы подходим к популярному мифу. Помните, вначале я говорила, что "a"+"b"+"c" приводит к созданию объектов ab и abc. Многие понимают это буквально, что это оператор + приводит к созданию лишних объектов. Поэтому лучше плюсик не использовать, а использовать StringBuilder.
Так вот, это неправда. StringBuilder используется под капотом плюсика со времён java 5. А это 2004 год, 17 лет уже прошло.
У такого подхода есть серьёзный недостаток. StringBuilder создаётся даже при сложении двух строк:
String s1 = "b";
String s2 = "с";
String s3 = s1 + s2;
В данном случае это не рационально.
Чтобы склеить две строки без лишних StringBuilder, используйте метод concat:
String s3 = s1.concat(s2);
Итого, как соединить две строки:
🔹 final строчки - через плюсик
🔹 Две строки - через concat
🔹 Несколько строк, но один раз - через плюсик, внутри работает StringBuilder
🔹 Сложные соединения, например, в цикле - явно объявить StringBuilder и использовать его
Ответ на вопрос перед постом
В первом варианте строка-результат соберётся на этапе компиляции, а во втором - во время работы программы. Поэтому первый вариант выполнится быстрее в 20-30 раз.String str = "a" + "b";Будет две части: 🔸 Часть 1: как всё работает в java 8 🔸 Часть 2: что изменилось в java 9
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
