Открытый канал ID 68536775128494

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
Открыть рубрику →

Публикации за период

По реакциям

Поиск и вся лента — после бесплатной регистрации. Свои даты — по подписке; владелец канала видит их бесплатно. Сортировка по реакциям — по подписке. Зарегистрироваться

Загрузка…

Топ-3 товаров через Map.merge Есть названия покупок с повторами. Сначала считаем частоты, затем сортируем записи:
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 Библиотека | Мы в Телеграм
Просмотры: 93
Перейти в пост Открыть в MAX Сообщить о неточности
🗄 Вебинар: JDBC: как 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

Рекламный пост

Просмотры: 135
Перейти в пост Открыть в MAX Сообщить о неточности
Почему equals у массивов в Java не сравнивает содержимое?

В 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 Библиотека | Мы в Телеграм
Просмотры: 188
Перейти в пост Открыть в MAX Сообщить о неточности
Какая структура данных в коллекции List?

В 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 Библиотека | Мы в Телеграм
Просмотры: 227
Перейти в пост Открыть в MAX Сообщить о неточности
Знали, что Map.getOrDefault может вызвать загрузку, даже когда ключ уже есть?

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 Библиотека | Мы в Телеграм
Просмотры: 263
Перейти в пост Открыть в MAX Сообщить о неточности
👩‍💻 Подводные камни Retry Policy в Java

В статье на реальных примерах показывают retry-штормы, фантомные повторы, дубли записей, особенности Spring Retry и работу с Kafka.

Хороший материал для тех, кто проектирует отказоустойчивые Java-сервисы.

⛓ Читать статью



Java Библиотека | Мы в Телеграм
Просмотры: 258
Перейти в пост Открыть в MAX Сообщить о неточности
Память в Java растёт? Сначала выясните, что удерживает объекты

Рост потребления памяти не всегда означает утечку или проблему со сборщиком мусора. GC может освободить только те объекты, которые больше недостижимы.

Если ненужные объекты остаются в статической Map, безразмерном кэше или коллекции, которую никто не очищает, они продолжают занимать память. Это уже может быть утечкой на уровне приложения.

Увеличение -Xmx даст больше времени, но не устранит причину.
Анализируйте heap dump: какие объекты накапливаются, кто хранит ссылки на них и почему они остаются достижимыми.

Важен не только объём занятой памяти, но и причина, по которой объекты всё ещё живы.

Java Библиотека | Мы в Телеграм
Просмотры: 261
Перейти в пост Открыть в MAX Сообщить о неточности
Собираете строку в цикле? Используйте StringBuilder вместо +=.

Строки в Java неизменяемы: при последовательной конкатенации приходится создавать новые строки и копировать накопленное содержимое. Чем больше итераций, тем выше затраты.

StringBuilder добавляет данные в изменяемый буфер, расширяя его при необходимости:

StringBuilder builder = new StringBuilder();

for (String item : items) {
builder.append(item);
}

String result = builder.toString();


Для накопления текста в цикле это обычно эффективнее.

Java Библиотека | Мы в Телеграм
Просмотры: 293
Перейти в пост Открыть в MAX Сообщить о неточности
Почему большинство объектов в Java «умирают молодыми»?

Приложение может создавать миллионы объектов:

for (int i = 0; i < 1_000_000; i++) {
User user = new User();
}


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

На этом наблюдении основана слабая поколенческая гипотеза: большинство объектов живут недолго. Поколенческие сборщики мусора используют её так:

• Новые объекты обычно размещаются в молодом поколении.
• Оно очищается чаще: сборщик сохраняет выжившие объекты и освобождает остальную память.
• Достаточно долго живущие объекты переводятся в старое поколение, которое собирается реже.

Так GC может освобождать память короткоживущих объектов, не обрабатывая каждый раз всю кучу.

Java Библиотека | Мы в Телеграм
Просмотры: 299
Перейти в пост Открыть в MAX Сообщить о неточности
Вся лента — после бесплатной регистрации
ВКонтакте Телеграм Одноклассники
Избранное в datool.ru

Следите за каналом в личном кабинете

Зарегистрируйтесь в datool.ru, чтобы добавить канал «Java библиотека» в избранное и отслеживать его показатели.

Зарегистрироваться
Для владельцев каналов

Подтвердите свой канал

Войдите или зарегистрируйтесь в datool.ru, затем добавьте нашего бота в канал по инструкции в личном кабинете. После проверки владения замок исчезнет и вам станет доступно управление каналом.

Войти или зарегистрироваться

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти