uz
Feedback

Firibgarlarga uchmang! Telemetrio bunday kanallarni topadi va belgilaydi 👉 Belgini ko‘rmoqchi bo‘lsangiz, obuna bo‘ling

Java | Фишки и трюки

Java | Фишки и трюки

Kanalga Telegram’da o‘tish

Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg

Ko'proq ko'rsatish
6 685
Obunachilar
-624 soatlar
-227 kun
-6730 kun
Postlar arxiv
🤖 Как создать B2B CRM с ИИ на Джеймикс и не потерять контроль над разработкой? ➡️ 2023 — попробуй ChatGPT ➡️ 2024 — генериру
🤖 Как создать B2B CRM с ИИ на Джеймикс и не потерять контроль над разработкой? ➡️ 2023 — попробуй ChatGPT ➡️ 2024 — генерируй код ➡️ 2025 — используй агентов ➡️ 2026 — пора разобраться, как встроить ИИ в управляемый процесс разработки 16 июня в 16:00 МСК — практический воркшоп от Джеймикс (Java-платформа с ИИ для разработки корпоративных систем), Kodacode и OpenIDE. Покажем, как пройти путь от постановки задачи до рабочего контура корпоративной CRM. Не в теории — в коде. Что разберём: 🔹 как сформировать спецификацию для разработки с ИИ 🔹 как удержать агента в рамках проекта 🔹 как создать модель данных, экраны и бизнес-логику 🔹 типичные ошибки агентного режима и как их исправлять 🔹 чем управляемая ИИ-разработка отличается от вайб-кодинга Заберёте с собой:готовый код open-source B2B CRM на Java со встроенным ИИ-ассистентом — можно сразу брать за основу в своих проектах. 👉 Регистрируйтесь #реклама О рекламодателе

⌨️ Выполнение команды в командной строке с выводом результата

public class CommandLine {
    public static void main(String[] args) throws IOException {
        Runtime rt = Runtime.getRuntime();
        String[] commands = {"ping", "-c 5", "google.com"};
        Process proc = rt.exec(commands);

        BufferedReader stdInput = new BufferedReader(new
                InputStreamReader(proc.getInputStream()));

        BufferedReader stdError = new BufferedReader(new
                InputStreamReader(proc.getErrorStream()));

        // Read the output from the command
        System.out.println("Here is the standard output of the command:\n");
        String s = null;
        while ((s = stdInput.readLine()) != null) {
            System.out.println(s);
        }

        // Read any errors from the attempted command
        System.out.println("Here is the standard error of the command (if any):\n");
        while ((s = stdError.readLine()) != null) {
            System.out.println(s);
        }
    }
}
Метод Runtime.getRuntime() возвращает объект, представляющий текущую среду выполнения Java. Этот объект позволяет запускать команды системы. Метод exec() запускает системную команду и возвращает объект Process, который представляет запущенный процесс. Команда, которую нужно выполнить, передается как массив строк. Далее получаем поток для чтения данных из стандартного вывода процесса, который был запущен и выводим на консоль. Так же поступаем и с потоком вывода ошибок. Вывод:
Here is the standard output of the command:

PING google.com (173.194.222.138): 56 data bytes
64 bytes from 173.194.222.138: icmp_seq=0 ttl=60 time=39.479 ms
64 bytes from 173.194.222.138: icmp_seq=1 ttl=60 time=39.753 ms
64 bytes from 173.194.222.138: icmp_seq=2 ttl=60 time=47.982 ms
64 bytes from 173.194.222.138: icmp_seq=3 ttl=60 time=39.569 ms
64 bytes from 173.194.222.138: icmp_seq=4 ttl=60 time=39.850 ms

--- google.com ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 39.479/41.327/47.982/3.330 ms
Here is the standard error of the command (if any):
#java #Runtime #exec

🛠 От BPMN до контейнера: собираем Java-приложение с OpenBPM и Axiom JDK Приглашаем на вебинар, где пройдем практический путь
🛠 От BPMN до контейнера: собираем Java-приложение с OpenBPM и Axiom JDK Приглашаем на вебинар, где пройдем практический путь от выстраивания бизнес-логики до релиза в приложения безопасном enterprise-контуре. Покажем, как собрать Spring Boot-приложение в OpenIDE с плагином от OpenBPM: описать BPMN-схему, связать ее с Java-логикой, запустить на Axiom JDK и аккуратно упаковать все это в контейнеры. Отдельно обсудим ИИ в разработке (а куда сейчас без него?). Обещать «заменить команду с помощью Claude» не будем, но точно расскажем, как искусственный интеллект помогает оптимизировать рутину, сохранив контроль и зоны ответственности. 📅 16 июня, онлайн, 11:00. 👥 Спикеры: — Никита Щиенко, Tech Lead, OpenBPM — Максим Сафронов, Технологический консультант Axiom JDK Все подробности — на странице вебинара. И не забудьте зарегистрироваться! #реклама О рекламодателе

⌨️ Захват переменных в лямбда-выражениях Лямбда-выражения могут захватывать переменные из внешнего окружения, делая их доступными внутри лямбда-функции. При этом переменные могут быть: 1️⃣ Неизменяемыми (effectively final) – Переменная из внешнего контекста, используемая в лямбде, должна быть объявлена как final или фактически быть неизменяемой (то есть не изменяться после первого присваивания). Например:

int x = 10;
Runnable r = () -> System.out.println(x);  // x захвачен в лямбде
2️⃣ Свободными от изменения в лямбде – Лямбда не может изменять захваченные переменные. Это ограничение гарантирует, что нет неоднозначного состояния, когда переменная изменяется из нескольких мест (например, из основного потока и из лямбда-функции одновременно). 3️⃣ Статическими или полями класса – В отличие от локальных переменных, статические поля класса или поля экземпляра могут свободно изменяться внутри лямбда-выражений, поскольку их значения хранятся в куче (heap) и доступны по ссылке. Пример:

public class Main {
    private static int staticVar = 20;

    public static void main(String[] args) {
        int localVar = 10;
        Runnable r = () -> System.out.println(localVar + staticVar);
        r.run();
    }
}
В этом примере localVar захватывается, так как он effectively final, а staticVar доступен, так как это статическое поле. #java #lambda #capturing

Решать технические задачи — самая простая часть работы в IT. Сложности начинаются там, где нужно договариваться со смежниками
Решать технические задачи — самая простая часть работы в IT. Сложности начинаются там, где нужно договариваться со смежниками, выстраивать процессы в хаосе и осознанно управлять карьерой. В канале @ulshinblog Никита (руководитель разработки в Highload, 10+ лет в IT) разбирает эти темы через понятную логику и личный опыт: 📍 Как пройти секцию System Design? Пошаговый чек-лист от интервьюера; 📍 Как находить внутренние сайд-проекты, которые принесут пользу и бизнесу, и вашему карьерному росту; 📍 Защита от плохой обратной связи: как вежливо поставить на место коллегу с неконструктивным фидбеком; 📍 Инженерный конвейер самообучения: как перестать читать книги для галочки и внедрять знания в жизнь и карьеру; 📚 База 50+ авторских обзоров IT-литературы для сильного инженера: разработка, управление, архитектура, мышление. 👉 Присоединяйтесь

Java-приложение в Docker В современном мире разработки программного обеспечения Docker становится важным инструментом, помогающим разрабатывать, тестировать и развертывать приложения в изолированной среде. Использование Docker с Java-приложениями позволяет значительно упростить процесс развертывания, гарантируя, что ваше приложение будет работать одинаково на всех средах. Docker — это платформа для создания, развертывания и управления контейнерами. Контейнеры изолируют приложения и все их зависимости, что делает возможным запуск кода в любом окружении без конфликта с другими приложениями. Шаг 1: Установка Docker Перед тем как начать, убедитесь, что Docker установлен на вашем компьютере. Вы можете следовать [официальной документации](https://docs.docker.com/get-docker/) для установки на вашу операционную систему. Шаг 2: Создание Java-приложения Для примера создадим простое приложение. Предположим, у вас есть простая программа, которая выводит "Hello, World!". Создайте файл HelloWorld.java:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
Скомпилируйте её с помощью:

javac HelloWorld.java
Шаг 3: Создание Dockerfile Dockerfile — это текстовый файл, позволяющий автоматически собирать образ Docker. Создайте файл с именем Dockerfile в каталоге вашего проекта:

# Используем официальный образ OpenJDK
FROM openjdk:17-jdk-slim

# Устанавливаем рабочий каталог
WORKDIR /app

# Копируем скомпилированный класс в контейнер
COPY HelloWorld.class ./

# Определяем команду запуска
CMD ["java", "HelloWorld"]
Шаг 4: Сборка Docker-образа Теперь создайте Docker-образ, используя следующую команду в каталоге вашего проекта:

docker build -t helloworld .
Эта команда соберет образ и назовет его helloworld. Шаг 5: Запуск контейнера Чтобы запустить контейнер, выполните команду:

docker run --rm helloworld
Вы должны увидеть вывод:
Hello, World!
Флаг --rm автоматически удаляет контейнер после его остановки. #java #docker

🔴 Завтра тестовое собеседование с Java-разработчиком 10 июня(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседо
🔴 Завтра тестовое собеседование с Java-разработчиком 10 июня(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Виктор Анохин, старший разработчик из WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Виктор будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Виктору Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. О рекламодателе.

☕️Text Blocks в Java: читаемые строки без \n и слёз До Java 13 работа с многострочными строками была болью. JSON? HTML? SQL? Только через "\n" + и кучу экранирования. Но с Text Blocks всё стало проще, понятнее и читаемо. Сравни: ❌ До:
String html = "<html>\n" +
              "  <body>Hello</body>\n" +
              "</html>";
✅ После (Text Block):
String html = """
    <html>
      <body>Hello</body>
    </html>
    """;
➡️ Стало чище, короче и как в оригинале. Это обычная String, просто оформленная красиво. ✔️ Преимущества Text Blocks: 1. 👍 Читаемость на уровне "как есть" Код больше не превращается в кашу. Особенно полезно для: SQL-запросов:
     String query = """
         SELECT id, name
         FROM users
         WHERE active = true
         ORDER BY created_at DESC
         """;
     
HTML/JSON шаблонов:
     String json = """
         {
           "name": "Alice",
           "role": "admin"
         }
         """;
     
2. 👍 Меньше экранирования Забудь про \", \\n, \\t — теперь можно писать почти как в блокноте. 3. 👍 Автоматическое выравнивание Java сама уберёт начальные отступы на основе самой "узкой" строки. Пример:
   String msg = """
           Line 1
           Line 2
       Line 3
       """;
   
➡️ Результат будет:
Line 1
Line 2
Line 3
4. 👍 Интеграция с .formatted() Нельзя вставить переменные прямо в Text Block? Используем .formatted() — коротко и читабельно:
String user = "Bob";
String template = """
    {
      "user": "%s",
      "access": "granted"
    }
    """.formatted(user);
````
   ```java
   String s = """
       Hello""";
   System.out.println(s.length());  // 6, а не 5 (есть \n)
   
3. 🟢 Нет интерполяции переменных Нельзя писать так:
   String name = "Eve";
   String wrong = """
       Hello, $name!
       """;  // ❌ не сработает
   
Вместо этого:
   String right = """
       Hello, %s!
       """.formatted(name);
   
🗣️ Запомни: Text Blocks делают строки в Java человечными. Это не просто сахар — это инструмент, чтобы твой код говорил с тобой на одном языке. Используй их для всего, что требует форматирования — и забудь про + "\n".

⌨️ Java Concurrency API: Основные классы Современные приложения все чаще требуют выполнения нескольких задач одновременно, и для этого Java предоставляет мощный инструмент — Concurrency API (набор классов и интерфейсов). Этот API позволяет разработчикам легко реализовывать многопоточность, управлять потоками и синхронизировать действия между ними, что значительно увеличивает производительность и отзывчивость приложений. Основные классы: 1. Thread - Класс для создания и управления потоками. Вы можете создать новый поток, реализовав интерфейс Runnable или расширив класс Thread. 2. Executor - Интерфейс для управления потоками и выполнения задач. Позволяет абстрагироваться от управления потоками, сосредоточившись на логике приложения. - ExecutorService: расширение Executor, управляющее жизненным циклом потоков. 3. Future - Позволяет получать результаты из асинхронных задач. Используется в связке с ExecutorService для выполнения задач в фоновом режиме. 4. CountDownLatch - Синхронизирует потоки, позволяя одному или нескольким потокам ждать завершения других потоков перед продолжением работы. 5. CyclicBarrier - Используется для синхронизации группы потоков. Позволяет потоку ждать, пока все другие не достигнут определенной точки. 6. Semaphore - Контролирует доступ к ресурсу, предоставляя определенное количество разрешений для потоков. 7. BlockingQueue - Интерфейс, предоставляющий безопасный способ обмена данными между потоками при помощи очередей. Реализации включают ArrayBlockingQueue, LinkedBlockingQueue и другие. #java #ConcurrencyAPI #Thread

Собрали подборку IT-каналов для тех, кто интересуется тестированием, разработкой, автотестами и карьерой в IT. Внутри: QA и A
Собрали подборку IT-каналов для тех, кто интересуется тестированием, разработкой, автотестами и карьерой в IT. Внутри: QA и AQA - практика, собеседования, рабочие заметки и разборы Java и Python - задачи, тесты, полезные фишки и материалы для разработчиков SQL и аналитика данных - запросы, работа с данными и прикладные разборы Программирование и IT-карьера - каналы для тех, кто развивается в профессии и хочет лучше понимать рынок Можно подписаться на всю подборку сразу или выбрать только те каналы, которые подходят под ваши цели. Забрать папку

⌨️ Desktop Класс Desktop используется для взаимодействия с приложениями операционной системы, такими как веб-браузер, почтовый клиент, просмотрщик изображений и т.д. Этот класс входит в пакет java.awt и позволяет, например, открыть веб-ссылку в браузере или отправить письмо через почтовый клиент. Основные возможности класса Desktop: ✔️ browse(URI uri) – открывает URI (например, веб-страницу) в браузере. ✔️ open(File file) – открывает файл в приложении, ассоциированном с его типом (например, текстовый файл в текстовом редакторе). ✔️ edit(File file) – открывает файл в режиме редактирования (если доступно). ✔️ mail(URI mailtoURI) – открывает почтовое приложение с указанным URI. ✔️ print(File file) – отправляет файл на печать. Пример:

import java.awt.*;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class DesktopExample {
    public static void main(String[] args) throws IOException, URISyntaxException {
        // Проверяем, поддерживает ли система класс Desktop
        if (Desktop.isDesktopSupported()) {
            Desktop desktop = Desktop.getDesktop();
            // Пример: Открытие веб-страницы
            URI uri = new URI("http://www.google.com");
            desktop.browse(uri);
        } else {
            System.out.println("Класс Desktop не поддерживается на этой системе.");
        }
    }
}
Проверка Desktop.isDesktopSupported() обязательна, так как класс может не поддерживаться на некоторых системах. #java #Desktop

⌨️ Почему Stream.parallel() может сделать код медленнее Когда разработчики впервые видят:

list.parallelStream()
возникает мысль: О, бесплатная многопоточность 🚀 Но на практике parallelStream() очень часто: ❗ НЕ ускоряет код ❗ делает его медленнее ❗ а иногда ещё и ломает логику 📦 Как это работает

list.parallelStream()
    .map(this::process)
    .toList();
Java разбивает задачи между потоками через ForkJoinPool.commonPool(). 🔥 Когда это реально помогает ✔️ CPU-heavy вычисления ✔️ большие объёмы данных ✔️ независимые операции Например: ✅ обработка миллионов чисел ✅ сложные математические вычисления ✅ image processing ⚠️ Когда будет хуже ❌ Маленькие коллекции

List.of(1, 2, 3)
    .parallelStream()
👉 накладные расходы на потоки будут больше пользы ❌ I/O операции

users.parallelStream()
     .map(this::callApi)
👉 потоки начинают ждать сеть/БД 👉 ForkJoinPool забивается ❌ Общие mutable-данные

List<String> result = new ArrayList<>();

list.parallelStream()
    .forEach(result::add);
💣 Race condition detected 🙂 ❌ Неочевидный порядок

parallelStream().forEach(System.out::println);
Порядок вывода будет случайным. 🧠 Самая скрытая проблема parallelStream() использует ОБЩИЙ pool потоков. То есть: ▸ твой код ▸ библиотека ▸ другой модуль приложения могут конкурировать за одни и те же потоки. 👉 Особенно весело в backend-приложениях. 🚀 Иногда обычный stream быстрее Почему? Потому что parallel: ▸ делит задачи ▸ синхронизирует результаты ▸ координирует потоки Это тоже стоит времени. ✅ Хорошее правило Используй parallelStream() только если: ▸ операция тяжёлая ▸ данных много ▸ нет shared mutable state ▸ ты реально измерил performance

⌨️ EnumMap — это реализация Map, которая использует в качестве ключей исключительно Enum. Внутренне EnumMap использует массив для хранения значений, где индекс массива соответствует порядковому номеру (ordinal()) элемента перечисления. Это делает его быстрее, чем хэш-таблицы (HashMap) и более экономным по памяти. EnumMap хранит ключи в порядке их объявления в перечислении, что отличает его от большинства других Map (кроме LinkedHashMap). Так как ключи строго ограничены перечислением, это снижает вероятность ошибок при разработке. 🔍 Пример:

import java.util.EnumMap;

enum Action {
    START, STOP, PAUSE
}

public class EnumMapExample {
    public static void main(String[] args) {
        EnumMap<Action, Runnable> actionMap = new EnumMap<>(Action.class);

        // Определяем поведение для каждого значения Enum
        actionMap.put(Action.START, () -> System.out.println("Starting the process..."));
        actionMap.put(Action.STOP, () -> System.out.println("Stopping the process..."));
        actionMap.put(Action.PAUSE, () -> System.out.println("Pausing the process..."));

        // Пример вызова
        Action currentAction = Action.START;
        actionMap.get(currentAction).run();
    }
}
#Java #EnumMap

⌨️ ThreadLocal - удобство, которое легко превращается в утечку памяти ThreadLocal выглядит как магия: У каждого потока будет своё собственное значение И это правда. Но именно из-за этого он часто становится источником очень неприятных багов в production. 📦 Как работает ThreadLocal

ThreadLocal<String> currentUser = new ThreadLocal<>();

currentUser.set("Alex");
Теперь в каждом потоке хранится своё значение:

System.out.println(currentUser.get());
🔥 Где это используют * Spring Security * Hibernate * логирование (`traceId`) * транзакции * хранение request context 🤔 Кажется идеально. В чём проблема? Проблема начинается с thread pool. ⚠️ Главная ловушка

ThreadLocal<String> local = new ThreadLocal<>();

executor.submit(() -> {
    local.set("DATA");
});
Поток из пула НЕ уничтожается после задачи. 👉 Значение остаётся висеть внутри потока. 💣 Что это вызывает * утечки памяти * неожиданные данные между запросами * "рандомные" баги в серверных приложениях 😨 Самое неприятное Даже если сам ThreadLocal удалён GC, значение внутри потока может продолжать жить. Почему? Потому что внутри Thread: * ключ (`ThreadLocal`) хранится как weak reference * а значение - как strong reference 👉 Ключ умер 👉 Значение осталось Классическая hidden memory leak. ✅ Правильный подход ВСЕГДА чистить ThreadLocal:

try {
    local.set("DATA");

    // работа
} finally {
    local.remove();
}
🚀 Почему это критично в Spring / Tomcat Сервер использует thread pool: * один поток обслуживает тысячи запросов * забытый ThreadLocal живёт очень долго Отсюда: * рост памяти * странное поведение пользователей * “невоспроизводимые” баги 🧠 Интересный факт ThreadLocal не хранит данные “в себе”. Наоборот: 👉 каждый Thread хранит ThreadLocalMap То есть данные лежат внутри потока, а не объекта ThreadLocal.

⌨️ Сравнение объектов с помощью Comparator и Comparable В Java для сортировки объектов используются два ключевых интерфейса: Comparable и Comparator. Понимание их отличий и применения поможет вам эффективно управлять сортировкой данных в коллекциях. 📚 Краткие определения: - Comparable: - Используется, когда класс должен иметь естественный порядок. Например, мы можем сортировать людей по возрасту. - Сигнатура метода: int compareTo(T o). Пример:

  class Person implements Comparable<Person> {
      private String name;
      private int age;

      public Person(String name, int age) {
          this.name = name;
          this.age = age;
      }

      public int getAge() {
          return age;
      }

      @Override
      public int compareTo(Person other) {
          return Integer.compare(this.age, other.age); // Сравнение по возрасту
      }
  }
- Comparator: - Используется для создания внешних стратегий сравнения, позволяя определять несколько способов сортировки. Подходит для сортировки объектов разных классов. - Сигнатура метода: int compare(T o1, T o2). Пример:

  import java.util.Comparator;

  class NameComparator implements Comparator<Person> {
      @Override
      public int compare(Person p1, Person p2) {
          return p1.name.compareTo(p2.name); // Сравнение по имени
      }
  }
⚖️ Когда использовать: - Comparable: - Используйте, если у класса есть естественный порядок. Например, чтобы сортировать людей по возрасту. - Сортировка с помощью Collections.sort() или Arrays.sort() будет проще. Пример использования:

  List<Person> people = Arrays.asList(new Person("Alice", 30), new Person("Bob", 25));
  Collections.sort(people); // Сортировка по возрасту с использованием Comparable
- Comparator: - Идеален для ситуаций, когда необходимо изменить порядок сортировки или сравнивать объекты разных классов. Пример использования:

  List<Person> people = Arrays.asList(new Person("Alice", 30), new Person("Bob", 25));
  Collections.sort(people, new NameComparator()); // Сортировка по имени с использованием Comparator
#java #Comparator #Comparable

⌨️ Чем абстрактный класс отличается от интерфейса? В каких случаях следует использовать абстрактный класс, а в каких интерфейс? ✔️ В Java класс может одновременно реализовать несколько интерфейсов, но наследоваться только от одного класса. ✔️ Абстрактные классы используются только тогда, когда присутствует тип отношений «is a» (является). Интерфейсы могут реализоваться классами, которые не связаны друг с другом. ✔️ Абстрактный класс - средство, позволяющее избежать написания повторяющегося кода, инструмент для частичной реализации поведения. Интерфейс - это средство выражения семантики класса, контракт, описывающий возможности. Все методы интерфейса неявно объявляются как public abstract или (начиная с Java 8) default - методами с реализацией по-умолчанию, а поля - public static final. ✔️ Интерфейсы позволяют создавать структуры типов без иерархии. ✔️ Наследуясь от абстрактного, класс «растворяет» собственную индивидуальность. Реализуя интерфейс, он расширяет собственную функциональность. Абстрактные классы содержат частичную реализацию, которая дополняется или расширяется в подклассах. При этом все подклассы схожи между собой в части реализации, унаследованной от абстрактного класса, и отличаются лишь в части собственной реализации абстрактных методов родителя. Поэтому абстрактные классы применяются в случае построения иерархии однотипных, очень похожих друг на друга классов. В этом случае наследование от абстрактного класса, реализующего поведение объекта по умолчанию может быть полезно, так как позволяет избежать написания повторяющегося кода. Во всех остальных случаях лучше использовать интерфейсы. #java #interface #abstract

🔴 Завтра тестовое собеседование с Java-разработчиком 13 мая(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседов
🔴 Завтра тестовое собеседование с Java-разработчиком 13 мая(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Виктор Анохин, старший разработчик из WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Виктор будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Виктору Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. О рекламодателе.

🛠 Разница между StringBuilder и StringBuffer И StringBuilder, и StringBuffer используются для работы со строками, но между ними есть важные отличия. ➡️ Основные различия: ✔️ StringBuilder быстрее, но не потокобезопасен. ✔️ StringBuffer потокобезопасен, но медленнее из-за синхронизации. ✔️ Пример использования StringBuilder:
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb); // Hello World
✔️ Пример использования StringBuffer:
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
System.out.println(sb); // Hello World
💡 Совет: Если ваш код выполняется в одном потоке, используйте StringBuilder для лучшей производительности. #java #stringbuilder #stringbuffer