Java библиотека
Книги, статьи, мемы и многое другое для Java программиста!
По сотрудничеству и рекламе: https://t.me/NadikaKir или в ЛС сообщества ВК https://vk.com/javatutorial
Канал в перечне РКН: https://vk.cc/cJrT4A
Мы на бирже: https://telega.in/c/javalib/
Сообщество VK https://vk.com/javatutorial
- Каналов в рубрике
- 1 733
- Место этого канала
- № 65
Дашборд
16 октября — 22 октября 2026
Загрузка…
Главные числа
Рост аудитории
+8подписчиков за период
+3 самый большой прирост · 17 окт 2026
Индекс качества
69/ 100Средний
- Аудитория 12 из 25
- Честность роста 25 из 25
- Рекламная нагрузка 20 из 20
- Доверие 4 из 20
- Достоверность расчёта 8 из 10
IT и программирование, 1–5 тыс. подписчиков · каналов в группе: 39
Просмотры и охват
6 509просмотров за период 28,9 %
Средний охват поста — 298 просмотров (посты старше двух суток).
Вовлечённость подписчиков
0,45 %ER = реакции ÷ просмотры 0,3 п. п.
Индекс цитируемости
0,0индекс цитируемости 100,0 %
Место среди похожих появится, когда канал упомянут другие каналы за последние 30 дней.
Когда и сколько публикует
Форматы публикаций
Каждый пост — точка
Выше — больше просмотров, крупнее — больше реакций. Нажмите на точку, чтобы открыть пост.
Итоги периода
Нажмите на показатель — ниже он появится по точкам периода
Реклама в канале
Лучшие публикации
По просмотрам за период
Публикации по дням
Бледные столбики — дни, линия — среднее за 7 дней: видно, разгоняется канал или затихает
Данные обновлены в 07:26 по Москве. Просмотры — текущие у постов, вышедших в эти дни; средний охват — по постам старше двух суток. Как считается индекс качества
Публикации за период
Загрузка…
Map<String, Integer> counts = new HashMap<>();
for (String item : purchases) {
counts.merge(item, 1, Integer::sum);
}
counts.entrySet().stream()
.sorted(Map.Entry.<String, Integer>
comparingByValue().reversed()
.thenComparing(Map.Entry.comparingByKey()))
.limit(3)
.forEach(System.out::println);
Второй критерий делает порядок при одинаковой частоте предсказуемым. Пример предполагает непустые, ненулевые названия. Для большого количества разных товаров полная сортировка может быть лишней: топ-k можно поддерживать ограниченной кучей. Сначала оцените размер данных. #Java
Java Библиотека | Мы в Телеграм
JDBC позволяет Java-приложениям работать с базами данных. Разберём подключение, SQL-запросы, транзакции и обработку ошибок.
💬 О чём поговорим
- Как подключиться к СУБД с помощью DriverManager и работать с Connection.
- Как выполнять SQL-запросы через Statement и PreparedStatement и получать результаты через ResultSet.
- Как управлять транзакциями: autocommit, commit и rollback.
- Как использовать SQLException, чтобы разобраться в причинах ошибки при выполнении запроса.
🎯 Результат урока:
- Вы разберётесь, как подключать Java-приложение к СУБД, выполнять SQL-запросы и работать с результатами.
- Узнаете, как управлять транзакциями и обрабатывать ошибки при обращении к базе данных.
👉 Для участия зарегистрируйтесь: https://vk.cc/d37axU
Вебинар проходит в рамках старта курса «Java-разработчик», который помогает освоить современную Java-разработку: от основ и первых программ до серверных приложений, баз данных, Spring, контейнеров и очередей сообщений. Программа регулярно обновляется под требования рынка. 🚀
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Рекламный пост
В Java массив выглядит как контейнер значений, поэтому легко ожидать, что equals сравнит элементы внутри.
Но массивы не переопределяют equals для содержимого. Обычный equals у массива работает почти как сравнение ссылок.
Например, два массива с одинаковыми числами не будут равны через equals:
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a.equals(b));
Результат будет false, потому что это два разных объекта в памяти.
Для одномерных массивов нужно использовать Arrays.equals:
System.out.println(Arrays.equals(a, b));
Теперь Java сравнит элементы по порядку и вернёт true.
С массивами объектов логика такая же:
String[] left = {"java", "ready"};
String[] right = {"java", "ready"};
System.out.println(Arrays.equals(left, right));
Но для вложенных массивов Arrays.equals уже недостаточно. Он сравнит внутренние массивы как объекты.
Для двумерных структур нужен deepEquals:
int[][] x = {{1, 2}, {3, 4}};
int[][] y = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepEquals(x, y));
То же самое касается вывода. Обычный toString у массива покажет служебное имя, а не элементы.
Для нормального вывода используют Arrays.toString:
System.out.println(Arrays.toString(a));
Если массив вложенный, нужен deepToString:
System.out.println(Arrays.deepToString(x));
Массивы в Java стоит сравнивать и выводить через Arrays. Иначе код может выглядеть логично, но проверять совсем не то.
Java Библиотека | Мы в Телеграм
В Java интерфейс List представляет упорядоченную коллекцию элементов, допускающую дубликаты. В зависимости от конкретной реализации (ArrayList, LinkedList, Vector), используется разная структура данных.
Основные реализации `List` и их структуры данных
ArrayList
Динамический массив
Структура данных: массив
Быстрая индексация O(1), но медленное удаление/вставка в середину O(n).
List<String> list = new ArrayList<>();
LinkedList
Двусвязный список
Структура данных: двусвязный список
Быстрое добавление/удаление элементов O(1), но медленный доступ по индексу O(n).
List<String> list = new LinkedList<>();
Vector
Динамический массив (синхронизирован)
Структура данных: массив (как ArrayList), но с синхронизацией.
Устарел, используется редко из-за synchronized методов (медленнее ArrayList).
List<String> list = new Vector<>();
Java Библиотека | Мы в Телеграм
Java сначала вычисляет аргументы метода, и только потом вызывает сам метод.
Поэтому дорогой вызов справа выполнится заранее:
User user = users.getOrDefault(id, loadUser(id));
Даже если users уже содержит id, loadUser(id) успеет выполниться. Если это запрос к базе, сеть или вычисление, приложение потратит время зря.
Для ленивого вычисления значения подойдёт computeIfAbsent:
User user = users.computeIfAbsent(id, this::loadUser);
Функция загрузки вызывается только тогда, когда ключ отсутствует или связан с null. Возвращённое ненулевое значение добавляется в map и дальше берётся из неё.
Проверь и семантику отсутствующего результата. Если загрузчик вернёт null, запись не появится, и следующий вызов снова попробует загрузить пользователя:
User user = users.computeIfAbsent(id, key -> findUser(key).orElse(null));
Ещё один нюанс касается конкурентного доступа. Для параллельных потоков выбирай подходящую concurrent map и не помещай в функцию долгую блокирующую работу без понимания гарантий конкретной реализации.
Java Библиотека | Мы в Телеграм
В статье на реальных примерах показывают retry-штормы, фантомные повторы, дубли записей, особенности Spring Retry и работу с Kafka.
Хороший материал для тех, кто проектирует отказоустойчивые Java-сервисы.
⛓ Читать статью
Java Библиотека | Мы в Телеграм
Рост потребления памяти не всегда означает утечку или проблему со сборщиком мусора. GC может освободить только те объекты, которые больше недостижимы.
Если ненужные объекты остаются в статической Map, безразмерном кэше или коллекции, которую никто не очищает, они продолжают занимать память. Это уже может быть утечкой на уровне приложения.
Увеличение -Xmx даст больше времени, но не устранит причину.
Анализируйте heap dump: какие объекты накапливаются, кто хранит ссылки на них и почему они остаются достижимыми.
Важен не только объём занятой памяти, но и причина, по которой объекты всё ещё живы.
Java Библиотека | Мы в Телеграм
Строки в Java неизменяемы: при последовательной конкатенации приходится создавать новые строки и копировать накопленное содержимое. Чем больше итераций, тем выше затраты.
StringBuilder добавляет данные в изменяемый буфер, расширяя его при необходимости:
StringBuilder builder = new StringBuilder();
for (String item : items) {
builder.append(item);
}
String result = builder.toString();
Для накопления текста в цикле это обычно эффективнее.
Java Библиотека | Мы в Телеграм
Приложение может создавать миллионы объектов:
for (int i = 0; i < 1_000_000; i++) {
User user = new User();
}
Многие нужны лишь на время выполнения метода, обработки запроса или промежуточного вычисления. Когда объект становится недостижимым, сборщик мусора может освободить его память.
На этом наблюдении основана слабая поколенческая гипотеза: большинство объектов живут недолго. Поколенческие сборщики мусора используют её так:
• Новые объекты обычно размещаются в молодом поколении.
• Оно очищается чаще: сборщик сохраняет выжившие объекты и освобождает остальную память.
• Достаточно долго живущие объекты переводятся в старое поколение, которое собирается реже.
Так GC может освобождать память короткоживущих объектов, не обрабатывая каждый раз всю кучу.
Java Библиотека | Мы в Телеграм
Загрузка…
Загрузка…
Загрузка…
Загрузка…
Загрузка…
Загрузка…
Загрузка…
Загрузка…