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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
Делаем микросервисы на Java 😎

Пишете Java-приложения? У вас есть два пути:

🔹 Делать монолитную архитектуру и разрабатывать ПО как единое целое
🔹 Разбить большое приложение на микросервисы и наладить между ними связь

И у второго пути масса преимуществ!

Легче ловить сбои и приводить приложение в порядок
Отдельные компоненты можно масштабировать, при этом не придётся переписывать всю систему
Разные микросервисы — разные технологии разработки
Можно обновлять приложение по отдельным частям
Разработка микросервиса легче, чем монолита

Интересно? Тогда записывайтесь на наш курс по микросервисам на Java.

Вы научитесь:

🔸 Делать микросервисы на Java и Kotlin
🔸 Работать с инструментами для разработки микросервисов
🔸 Использовать популярный Java-фреймворк Spring Boot

Знания прямо по ходу курса можно использовать в работе.

Купите место на курсе по сниженной цене — всего 20 000 рублей. Повышаем цены уже 15 июля.

Старт курса 20 августа, программа и запись на нашем сайте: https://slurm.club/3awhAKa
#вопросы_с_собеседований
Как выбрать все элементы определенного каталога по критерию (например, с определенным расширением)?

Метод File.listFiles возвращает массив объектов File, содержащихся в каталоге. Метод может принимать в качестве параметра объект класса, реализующего FileFilter. Это позволяет включить в список только те элементы, для которых метод accept возвращает true (критерием может быть длина имени файла или его расширение).
Это приглашение на «быстрое свидание» с работой мечты в команде Сбера.

One Day Offer — самый короткий путь до оффера. Пройти собеседование и получить ответ в тот же день можно 16 и 17 июля по двум вакансиям: Data Engineer в ИТ-команду «Комплаенс» и Java Developer в ИТ-подразделение «Сеть продаж».

Как это работает?

Шаг 1. 16 июля или 17 июля (в зависимости от вакансии) подключитесь к онлайн-интервью.
Шаг 2. Получите предложение о работе, о которой мечтали, в тот же день.
Шаг 3. А дальше — вместе со своей командой разрабатывайте крутые и важные продукты Сбера.

Прочитать подробнее о вакансиях и отправить заявку на участие в One Day Offer можно здесь.
Рефлексия (Reflection) — это механизм получения данных о программе во время её выполнения (runtime). В Java Reflection осуществляется с помощью Java Reflection API, состоящего из классов пакетов java.lang и java.lang.reflect.

Возможности Java Reflection API:
✔️Определение класса объекта;
✔️Получение информации о модификаторах класса, полях, методах, конструкторах и суперклассах;
✔️Определение интерфейсов, реализуемых классом;
✔️Создание экземпляра класса;
✔️Получение и установка значений полей объекта;
✔️Вызов методов объекта;
✔️Создание нового массива.
#вопросы_с_собеседований
Существует ли возможность перенаправить потоки стандартного ввода/вывода?

Класс System позволяет вам перенаправлять стандартный ввод, вывод и поток вывода ошибок, используя простой вызов статического метода:
setIn(InputStream) - для ввода;
setOut(PrintStream) - для вывода;
setErr(PrintStream) - для вывода ошибок.
#вопросы_с_собеседований
Может ли значение в столбце, на который наложено ограничение FOREIGN KEY, равняться NULL?

Может, если на данный столбец не наложено ограничение NOT NULL.
Как написать свой первый автотест за 1 час?

Посетить открытое занятие курса "Автоматизация тестирования на Java" от ребят из школы автоматизации QA.GURU бесплатное открытое занятие состоится 20-го июля в 20:00 МСК.

Почему надо сходить:
— Разработаем ваш первый (или не первый) автотест на поиск в Google
—Расскажем о рынке QA. Кто, кому, за что и сколько платит?
— Покажем боевой проект с полной инфраструктурой (Web, mobile, API)
— Дадим домашнее задание и проверим его у всех участников.

Занятие бесплатное — для участия вступайте в чат @qa_guru_chat — ссылка на занятие будет там.
#вопросы_с_собеседований
Что такое «абсолютный путь» и «относительный путь»?

Абсолютный (полный) путь
— это путь, который указывает на одно и то же место в файловой системе, вне зависимости от текущей рабочей директории или других обстоятельств. Полный путь всегда начинается с корневого каталога.

Относительный путь представляет собой путь по отношению к текущему рабочему каталогу пользователя или активного приложения.
#вопросы_с_собеседований
Что такое «символьная ссылка»?

Символьная (символическая)
ссылка (также «симлинк», Symbolic link) — специальный файл в файловой системе, в котором, вместо пользовательских данных, содержится путь к файлу, который должен быть открыт при попытке обратиться к данной ссылке (файлу). Целью ссылки может быть любой объект: например, другая ссылка, файл, каталог или даже несуществующий файл (в последнем случае, при попытке открыть его, должно выдаваться сообщение об отсутствии файла).

Символьные ссылки используются для более удобной организации структуры файлов на компьютере, так как:
• позволяют для одного файла или каталога иметь несколько имён и различных атрибутов;
• свободны от некоторых ограничений, присущих жёстким ссылкам (последние действуют только в пределах одной файловой системы (одного раздела) и не могут ссылаться на каталоги).
Java-разработчики, новость для вас: с 5 по 20 августа на платформе All Cups пройдёт онлайн-чемпионат IT_One Cup.Java, организованный совместно Сколково и IT_ONE.
Вы сможете проверить свои силы в интересных задачах и выиграть денежные призы — до 250 тысяч рублей. К участию приглашаем разработчиков уровня Middle и Senior.
👉 Регистрируйтесь до 10 августа: https://vk.cc/cfb7Yg
🔹Участников ждёт два этапа — квалификационный раунд и финал. Задача — реализовать сервис, который соответствует определённому API и способен пройти все проверки тестирующей системы.
🔹Денежные призы получат первые пять мест, топ-20 участникам подарим мерч, а самых талантливых ребят пригласим на работу в компанию IT_ONE.
#вопросы_с_собеседований
Что такое «сериализация»?

Сериализация (Serialization)
- процесс преобразования структуры данных в линейную последовательность байтов для дальнейшей передачи или сохранения. Сериализованные объекты можно затем восстановить (десериализовать).

В Java, согласно спецификации Java Object Serialization существует два стандартных способа сериализации: стандартная сериализация, через использование интерфейса java.io.Serializable и «расширенная» сериализация - java.io.Externalizable.

Сериализация позволяет в определенных пределах изменять класс. Вот наиболее важные изменения, с которыми спецификация Java Object Serialization может справляться автоматически:

• добавление в класс новых полей;
• изменение полей из статических в нестатические;
• изменение полей из транзитных в нетранзитные.

Обратные изменения (из нестатических полей в статические и из нетранзитных в транзитные) или удаление полей требуют определенной дополнительной обработки в зависимости от того, какая степень обратной совместимости необходима.
#вопросы_с_собеседований
Опишите процесс сериализации/десериализации с использованием Serializable.

При использовании Serializable применяется алгоритм сериализации, который с помощью рефлексии (Reflection API) выполняет:
• запись в поток метаданных о классе, ассоциированном с объектом (имя класса, идентификатор SerialVersionUID, идентификаторы полей класса);
• рекурсивную запись в поток описания суперклассов до класса java.lang.Object (не включительно);
• запись примитивных значений полей сериализуемого экземпляра, начиная с полей самого верхнего суперкласса;
• рекурсивную запись объектов, которые являются полями сериализуемого объекта.
При этом ранее сериализованные объекты повторно не сериализуются, что позволяет алгоритму корректно работать с циклическими ссылками.

Для выполнения десериализации под объект выделяется память, после чего его поля заполняются значениями из потока. Конструктор объекта при этом не вызывается. Однако при десериализации будет вызван конструктор без параметров родительского несериализуемого класса, а его отсутствие повлечёт ошибку десериализации.
Java-разработчики ЦВТ создают сервисы для наших ключевых клиентов: самой дорогой компании Рунета, крупнейшего частного банка в России и онлайн-банка в мире.

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

Пиши @KhisamovaS, что ты от канала Библиотека джависта и стань частью одной из продуктовых команд.
#вопросы_с_собеседований
Как изменить стандартное поведение сериализации/десериализации?

• Реализовать интерфейс java.io.Externalizable, который позволяет применение пользовательской логики сериализации. Способ сериализации и десериализации описывается в методах writeExternal() и readExternal(). Во время десериализации вызывается конструктор без параметров, а потом уже на созданном объекте вызывается метод readExternal.
• Если у сериализуемого объекта реализован один из следующих методов, то механизм сериализации будет использовать его, а не метод по умолчанию :
writeObject() - запись объекта в поток;
readObject() - чтение объекта из потока;
writeReplace() - позволяет заменить себя экземпляром другого класса перед записью;
readResolve() - позволяет заменить на себя другой объект после чтения.
#вопросы_с_собеседований
Как написать immutable класс?

Чтоб написать immutable неизменяемый класс, нужно следовать простым пунктам:
⁃ сделать класс финальным.
⁃ сделать все поля приватными и создать только геттеры к ним. Сеттеры, разумеется, не нужно.
⁃ сделать все mutable поля final, чтобы установить значение можно было только один раз.
⁃ инициализировать все поля через конструктор, выполняя глубокое копирование (то есть, копируя и сам объект, и его переменные, и переменные переменных, и так далее).
⁃ клонировать объекты mutable переменных в геттерах, чтобы возвращать только копии значений, а не ссылки на актуальные объекты.
#вопросы_с_собеседований
Что обозначает ключевое слово transient?

Поля класса, помеченные модификатором transient, не сериализуются.

Обычно в таких полях хранится промежуточное состояние объекта, которое, к примеру, проще вычислить. Другой пример такого поля - ссылка на экземпляр объекта, который не требует сериализации или не может быть сериализован.
#вопросы_с_собеседований
Какое влияние оказывают на сериализуемость модификаторы полей static и final?

При стандартной сериализации поля, имеющие модификатор static, не сериализуются. Соответственно, после десериализации это поле значения не меняет. При использовании реализации Externalizable сериализовать и десериализовать статическое поле можно, но не рекомендуется этого делать, т.к. это может сопровождаться трудноуловимыми ошибками.

Поля с модификатором final сериализуются как и обычные. За одним исключением – их невозможно десериализовать при использовании Externalizable, поскольку final поля должны быть инициализированы в конструкторе, а после этого в readExternal() изменить значение этого поля будет невозможно. Соответственно, если необходимо сериализовать объект с final полем необходимо использовать только стандартную сериализацию.
Учебник по Java: списочный массив ArrayList

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

https://proglib.io/sh/q3vFKyklI0
#вопросы_с_собеседований
Как создать собственный протокол сериализации?

Для создания собственного протокола сериализации достаточно реализовать интерфейс Externalizable, который содержит два метода:

public void writeExternal(ObjectOutput out) throws IOException;
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
#вопросы_с_собеседований
Какая роль поля serialVersionUID в сериализации?

serialVersionUID используется для указания версии сериализованных данных.

Когда мы не объявляем serialVersionUID в нашем классе явно, среда выполнения Java делает это за нас, но этот процесс чувствителен ко многим метаданным класса включая количество полей, тип полей, модификаторы доступа полей, интерфейсов, которые реализованы в классе и пр.

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

private static final long serialVersionUID = 20161013L;