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

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

Обратная связь: @proglibrary_feedback_bot

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

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
Зелёные (легковесные) потоки (green threads) — потоки, эмулируемые виртуальной машиной или средой исполнения. Создание зелёного потока не подразумевает под собой создание реального потока ОС.

Виртуальная машина Java берёт на себя заботу о переключении между разными green threads, а сама машина работает как один поток ОС. Это даёт несколько преимуществ. Потоки ОС относительно дороги в большинстве POSIX-систем. Кроме того, переключение между native threads гораздо медленнее, чем между green threads.

Это всё означает, что в некоторых ситуациях green threads гораздо выгоднее, чем native threads. Система может поддерживать гораздо большее количество green threads, чем потоков OС. Например, гораздо практичнее запускать новый green thread для нового HTTP-соединения к веб-серверу, вместо создания нового native thread.

Однако есть и недостатки. Самый большой заключается в том, что вы не можете исполнять два потока одновременно. Поскольку существует только один native thread, только он и вызывается планировщиком ОС. Даже если у вас несколько процессоров и несколько green threads, только один процессор может вызывать green thread. И всё потому, что с точки зрения планировщика заданий ОС всё это выглядит одним потоком.

Начиная с версии 1.2 Java поддерживает native threads, и с тех пор они используются по умолчанию.
#вопросы_с_собеседований
Какая разница между JSPWriter и сервлетным PrintWriter?
PrintWriter является объектом, отвечающим за запись содержания ответа на запрос. JspWriter использует объект PrintWriter для буферизации. Когда буфер заполняется или сбрасывается, JspWriter использует объект PrintWriter для записи содержания в ответ.
#вопросы_с_собеседований
SQL
Перечислите основные агрегатные функции.
Агрегатные функции - функции, которые берут группы значений и сводят их к одиночному значению.

SQL предоставляет несколько агрегатных функций:

COUNT - производит подсчет записей, удовлетворяющих условию запроса; SUM - вычисляет арифметическую сумму всех значений колонки; AVG - вычисляет среднее арифметическое всех значений; MAX - определяет наибольшее из всех выбранных значений; MIN - определяет наименьшее из всех выбранных значений.
Наиболее используемые методы класса File:

☕️ boolean createNewFile(): делает попытку создать новый файл;
☕️ boolean delete(): делает попытку удалить каталог или файл;
☕️ boolean mkdir(): делает попытку создать новый каталог;
☕️ boolean renameTo(File dest): делает попытку переименовать файл или каталог;
☕️ boolean exists(): проверяет, существует ли файл или каталог;
☕️ String getAbsolutePath(): возвращает абсолютный путь для пути, переданного в конструктор объекта;
☕️ String getName(): возвращает краткое имя файла или каталога;
☕️ String getParent(): возвращает имя родительского каталога;
☕️ boolean isDirectory(): возвращает значение true, если по указанному пути располагается каталог;
☕️ boolean isFile(): возвращает значение true, если по указанному пути находится файл;
☕️ boolean isHidden(): возвращает значение true, если каталог или файл являются скрытыми;
☕️ long length(): возвращает размер файла в байтах;
☕️ long lastModified(): возвращает время последнего изменения файла или каталога;
☕️ String[] list(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге;
☕️ File[] listFiles(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге.
Как контейнер сервлетов управляет жизненным циклом сервлета, когда и какие методы вызываются?

Контейнер сервлетов управляет четырьмя фазами жизненного цикла сервлета:
• Загрузка класса сервлета — когда контейнер получает запрос для сервлета, то происходит загрузка класса сервлета в память и вызов его конструктора без параметров.
• Инициализация класса сервлета — после того как класс загружен контейнер инициализирует объект ServletConfig для этого сервлета и внедряет его через init() метод. Это и есть место где сервлет класс преобразуется из обычного класса в сервлет.
• Обработка запросов — после инициализации сервлет готов к обработке запросов. Для каждого запроса клиента сервлет контейнер порождает новый поток и вызывает метод service() путем передачи ссылки на объекты ответа и запроса.
• Удаление - когда контейнер останавливается или останавливается приложение, то контейнер сервлетов уничтожает классы сервлетов путем вызова destroy() метода.

Таким образом, сервлет создаётся при первом обращении к нему и живёт на протяжении всего времени работы приложения (в отличии от объектов классов, которые уничтожаются сборщиком мусора после того, как они уже не используются) и весь жизненный цикл сервлета можно описать как последовательность вызова методов:
public void init(ServletConfig config) – используется контейнером для инициализации сервлета. Вызывается один раз за время жизни сервлета.
public void service(ServletRequest request, ServletResponse response) – вызывается для каждого запроса. Метод не может быть вызван раньше выполнения init() метода.
public void destroy() – вызывается для уничтожения сервлета (один раз за время жизни сервлета).
Surviving the Whiteboard Interview (2019)
Автор: William Gant
Количество страниц: 136

Whiteboard-этап интервью может показаться большой проблемой для начинающих разработчиков. Опытные разработчики могут взять себя в руки и справиться с возрастающим напряжением, но как быть тем, кто собеседуется на позицию Junior'а? Автор книги использует свои реальные знания и опыт, чтобы помочь вам преодолеть психологические препятствия, связанные с интервью, а также предлагает образцы задач. При наличии достаточной подготовки и уверенности в себе вы сможете пройти whiteboard-собеседование в любой организации. Автор также дает общие советы по прохождению собеседования, например, рассказывает, как произвести наилучшее впечатление на интервьюера.

Скачать книгу
Компания: Kotelov https://kotelov.com
Формат работы: Офис (в центре Петербурга) или удаленка
Занятость: Полная

Что мы ждем от тебя:
1. Опыт коммерческой разработки на Java от 3-х лет;
2. Понимание принципов ООП и SOLID;
3. Знание фреймворка spring boot;
4. Опыт в проектировании и написание Rest API;
5. Опыт работы с брокерами очередей (RabbitMQ, Kafka, etc);

Будет плюсом:
1. Знакомство с JAVA EE;
2. Опыт работы с Kafka, умение конфигурировать и оптимизировать;
3. Опыт работы с Kubernetes.

Контакты: @kristina_anfimiadi (Кристина)
Есть ли смысл определять для сервлета конструктор? Каким образом лучше инициализировать данные?

Большого смысла определять для сервлета конструктор нет, т.к. инициализировать данные лучше не в конструкторе, а переопределив метод init(), в котором имеется возможность доступа к параметрам инициализации сервлета через использование объекта ServletConfig.
#вопросы_с_собеседований
Имеет ли смысл индексировать данные, имеющие небольшое количество возможных значений?
Senior Java-разработчик, присоединяйся к нашей команде Luxoft и получи не только работу мечты, но и Welcome Bonus, который точно порадует!

До 31 октября 2021 года заполни короткую форму, и мы расскажем о наших проектах и бонусе!

Все подробности и регистрация по ссылке.
Библиотека джависта | Java, Spring, Maven, Hibernate
#вопросы_с_собеседований Имеет ли смысл индексировать данные, имеющие небольшое количество возможных значений?
Примерное правило, которым можно руководствоваться при создании индекса - если объем информации (в байтах) НЕ удовлетворяющей условию выборки меньше, чем размер индекса (в байтах) по данному условию выборки, то в общем случае оптимизация приведет к замедлению выборки.
💥 Java Hiring Sprint, 18-29 октября | онлайн
Мы приглашаем Java-разработчиков уровня Middle/Senior/Lead/Architect с опытом работы от 2 лет стать частью команды EPAM Anywhere.

🎯 Пройди техническое интервью и в течение 48 часов получи оффер от EPAM Anywhere, а также бонус до US $5,000 после присоединения к нашей команде!

🔸 Бонус для специалиста уровня Middle – US $2,000
🔸 Бонус для специалиста уровня Senior — US $3,000
🔸 Бонус для специалиста уровня Lead — US $4,000
🔸 Бонус для специалиста уровня Architect — US $5,000.
Сумма бонуса фиксирована независимо от оклада.

Хочешь узнать больше? Заполни регистрационную форму и узнай о платформе EPAM Anywhere и Java Hiring Sprint!

👉 Зарегистрироваться -> https://epa.ms/2aWdI1
Добрый вечер. Комьюнити Библиотеки программиста подумывает о том, чтобы организовать встречу офлайн в конце октября у нас на локации в мск. Хотим узнать ваше мнение, во что бы вы хотели поиграть в компании из 6-10 человек (единомышленников-программистов)
Anonymous Poll
15%
Монополия
20%
Мафия
9%
Крокодил
5%
Домино
18%
Покер
14%
Кто я такой (стикеры на лбу)
11%
Квизы (участики делятся на команды)
13%
Манчкин
4%
Другое (в комментариях)
41%
Полное прекращение работы Telegram в России
Фреймворк Fork/Join, представленный в JDK 7, - это набор классов и интерфейсов позволяющих использовать преимущества многопроцессорной архитектуры современных компьютеров. Он разработан для выполнения задач, которые можно рекурсивно разбить на маленькие подзадачи, которые можно решать параллельно.

• Этап Fork: большая задача разделяется на несколько меньших подзадач, которые в свою очередь также разбиваются на меньшие. И так до тех пор, пока задача не становится тривиальной и решаемой последовательным способом.
• Этап Join: далее (опционально) идёт процесс «свёртки» - решения подзадач некоторым образом объединяются пока не получится решение всей задачи.
Решение всех подзадач (в т.ч. и само разбиение на подзадачи) происходит параллельно.

Для решения некоторых задач этап Join не требуется. Например, для параллельного QuickSort — массив рекурсивно делится на всё меньшие и меньшие диапазоны, пока не вырождается в тривиальный случай из 1 элемента. Хотя в некотором смысле Join будет необходим и тут, т.к. всё равно остаётся необходимость дождаться пока не закончится выполнение всех подзадач.

Ещё одно замечательное преимущество этого фреймворка заключается в том, что он использует work-stealing алгоритм: потоки, которые завершили выполнение собственных подзадач, могут «украсть» подзадачи у других потоков, которые всё ещё заняты.
#вопросы_с_собеседований
Как создать потокобезопасный Singleton?
Static field
 class Singleton {
public static final Singleton INSTANCE = new Singleton();
}

• Enum
 enum Singleton {
INSTANCE;
}

Synchronized Accessor
 class Singleton {
private static Singleton instance;

public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

• Double Checked Locking & volatile
 class Singleton {
private static volatile Singleton instance;

public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}
}

• On Demand Holder Idiom
public class Singleton {

public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}

public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
Привет, Username! Приглашаем тебя на новый хакатон Цифрового Прорыва на тему "Транспорт и логистика"!

Для тебя мы подготовили крутецкие кейсы от Росатома, Ростелекома, Транспортных инноваций Москвы, международного аэропорта Шереметьево, Accenture и др.!

Участвовать можно онлайн из любой точки России, либо в специальных оффлайн-коворкингах (см. список доступных на сайте).

Успей собрать команду 3-5 человек (или присоединиться к имеющимся), выбрать кейс и побороться за призовой фонд до 4.500.000 руб. 🚀🚀🚀

Регистрируйся прямо сейчас: https://proglib.io/w/589dba35