Библиотека джависта | Java, Spring, Maven, Hibernate
24.5K subscribers
1.93K photos
38 videos
42 files
2.73K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://yangx.top/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
#вопросы_с_собеседований
Для Enum есть специальный класс java.util.EnumSet. Зачем? Чем авторов не устраивал HashSet или TreeSet?

EnumSet - это реализация интерфейса Set для использования с перечислениями (Enum). В структуре данных хранятся объекты только одного типа Enum, указываемого при создании. Для хранения значений EnumSet использует массив битов (bit vector), - это позволяет получить высокую компактность и эффективность. Проход по EnumSet осуществляется согласно порядку объявления элементов перечисления.

Все основные операции выполняются за O(1) и обычно (но не гарантированно) быстрее аналогов из HashSet, а пакетные операции (bulk operations), такие как containsAll() и retainAll() выполняются даже гораздо быстрей.

Помимо всего EnumSet предоставляет множество статических методов инициализации для упрощенного и удобного создания экземпляров.
IEEEXtreme — 24-ех часовое соревнование по программированию, в котором участникам предлагается решать разнообразные задачки. Недавно был проведен эксперимент, в котором нейросеть ChatGPT принимала участие в соревновании, причем тестировали три языка: Java, C++ и Python. Результат печальный: в среднем человек оказывается в 3-5 раз более успешным, а на advanced уровне эффективность ChatGPT падает в 23 раза. При этом разница между 4 и 3.5 версией нейросети практически отсутствует.

Восстание машин отменяется?
Зубчатый массив в Java

Зубчатый массив — это массив массивов, в котором массивы элементов могут быть разных размеров, т. е. мы можем создать двумерный массив, но с переменным числом столбцов в каждой строке. Эти типы массивов также известны как зубчатые массивы.

Подробнее о зубчатых массивах можно почитать здесь.
Сталкивались с дискриминацией по возрасту от работодателей? Считаете ли её справедливой?
NullPointer Exception

Исключение нулевого указателя возникает в Java довольно часто при попытке вызова метода несуществующего объекта.

Рассмотрим строчку кода из примера 1 на картинке. Если объект school окажется равен null или его метод listStudents вернет null, вы получите исключение NullPointerException.

Хорошей практикой разработки на Java является предварительная проверка на null в методах (как в примере 2).
📝 Как правильно составить сопроводительное письмо программисту

Давайте разберемся, зачем нужно сопроводительное письмо и как его написать так, чтобы вас захотели взять на работу.

🔗 Основной сайт
🔗 Зеркало
🎡 Что такое комбинаторика и как она используется в программировании

Расскажем, какие задачи помогает решать комбинаторика и зачем программистам нужно ее знать.

🔗 Основной сайт
🔗 Зеркало
Какое исключение выбрасывается при возникновении ошибки в блоке инициализации класса?

Если возникшее исключение - наследник RuntimeException:
• для статических блоков инициализации будет выброшено java.lang.ExceptionInInitializerError;
• для нестатических будет проброшено исключение-источник.
Если возникшее исключение - наследник Error, то в обоих случаях будет выброшено java.lang.Error. Исключение: java.lang.ThreadDeath - смерть потока. В этом случае никакое исключение выброшено не будет.
#вопросы_с_собеседований
Можем ли мы перегрузить методы по возвращаемому типу?

Мы не можем перегружать по возвращаемому типу. Это поведение аналогично C++.
🌵 Мексиканская перестрелка: какую IT-профессию выбрать джуну в 2023 году, чтобы зарабатывать $100кк в наносек

В этой статье мы рассмотрим несколько перспективных IT-направлений, которые приблизят вас к заветным цифрам на вашем банковском счете.

Читать статью
Кто кого расширяет: Queue расширяет Deque, или Deque расширяет Queue?

Queue — это очередь, которая обычно (но не обязательно) строится по принципу FIFO (First-In-First-Out) — соответственно извлечение элемента осуществляется с начала очереди, вставка элемента — в конец очереди. Хотя этот принцип нарушает, к примеру, PriorityQueue, использующая «natural ordering» или переданный Comparator при вставке нового элемента.

Deque (Double Ended Queue) расширяет Queue и, согласно документации, это линейная коллекция, поддерживающая вставку/извлечение элементов с обоих концов. Помимо этого реализации интерфейса Deque могут строится по принципу FIFO, либо LIFO.

Реализации и Deque, и Queue обычно не переопределяют методы equals() и hashCode(), вместо этого используются унаследованные методы класса Object, основанные на сравнении ссылок.

#вопросы_с_собеседований
Что такое перегрузка методов?

Перегрузка методов — это свойство полиморфизма, в котором при помощи изменения сигнатуры метода можно создать различные реализации методов для одной и той же операции:
☕️ одинаковое имя метода;
☕️ различные аргументы;
☕️ различный порядок аргументов;

Например, один и тот же add() из List может быть перегружен следующим образом и будет выполнять добавление разным способом, в зависимости от аргументов метода:
☕️ add(Object o) — просто добавляет объект;
☕️ add(int index, Object o) — добавляет объект в определенный индекс;
☕️ add(Collection c) — добавляет список объектов;
☕️ add(int index, Collection c) — добавляет список объектов, начиная с определенного индекса.
#вопросы_с_собеседований
Джуны в шоке, какие таблицы ведут тимлиды. А вы прошли бы такой отбор?
#интерактив
👩‍💻 Docker Compose и Spring Boot 3.1 👩‍💻

Наверняка вам приходилось запускать разрабатываемое приложение для какого-то ручного тестирования разрабатываемых функций. А для этого, как правило, нужно некоторое окружение: базы данных, серверы кэша, брокеры очередей сообщений и т.д.
И чтобы не разворачивать это всё вручную, можно использовать контейнеры, а разработчики Spring Boot предлагают интеграцию Spring Boot и Docker Compose, благодаря которой использование контейнеров требует минимум кода.

Смотреть видео
Поддерживает ли язык Java множественное наследование?

Это очень хитрый вопрос. Интервьюеры часто говорят: если язык C++ может поддерживать непосредственное множественное наследование, то почему Java не может?

Ответ несколько более сложен, чем может показаться на первый взгляд, поскольку Java поддерживает множественное наследование типов, ведь интерфейс в нём может расширять другие интерфейсы. Но множественное наследование реализаций язык Java не поддерживает.
#вопросы_с_собеседований
assert может принимать 2 аргумента

Обычно assert используется для проверки некоторого условия и бросает AssertionError если условие не удовлетворяется. Чаще всего проверка выглядит так (см пример 1 на картинке). Однако, она может быть и такой, как в примере 2.

Второе выражение (кстати, оно ленивое) возвращает значение типа Object, которое передаётся в AssertionError и несёт пользователю дополнительные сведения об ошибке. Более формальное описание можно посмотреть тут.
Сколько памяти нужно для запуска 1 миллиона конкурирующих задач?

В cтатье сравнивается потребление памяти между асинхронными и многопоточными программами популярных языков — Rust, Go, Java, C#, Python, Node.js, Elixir. Спойлер — худший результат показал Elixir.

Читать статью
Увлекаетесь биохакингом?
Расскажите в комментариях ⬇️
#интерактив
Можно ли так реализовать метод equals?

Нельзя, так как метод hashCode() не гарантирует уникальность значения для каждого объекта.

Но для сравнения экземпляров объекта Object такой метод допустим, так как там хешкод вычисляется на основании использовании адреса объекта в памяти, поэтому он уникален для разных объектов.
#вопросы_с_собеседований