Библиотека джависта | 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
加入频道
ClassCastException (потомок RuntimeException) - исключение, которое будет выброшено при ошибке приведения типа.
LocalDateTime объединяет вместе LocaleDate и LocalTime, содержит дату и время в календарной системе ISO-8601 без привязки к часовому поясу. Время хранится с точностью до наносекунды. Содержит множество удобных методов, таких как plusMinutes, plusHours, isAfter, toSecondOfDay и т.д.
#вопросы_с_собеседований
Какие наиболее распространенные задачи выполняются в контейнере сервлетов?
☕️ Поддержка обмена данными. Контейнер сервлетов предоставляет легкий способ обмена данными между веб клиентом (браузером) и сервлетом. Благодаря контейнеру нет необходимости создавать слушателя сокета на сервере для отслеживания запросов от клиента, а так же разбирать запрос и генерировать ответ. Все эти важные и комплексные задачи решаются с помощью контейнера и разработчик может сосредоточиться на бизнес-логике приложения.
☕️ Управление жизненным циклом сервлетов и ресурсов. Начиная от загрузки сервлета в память, инициализации, внедрения методов и заканчивая уничтожением сервлета. Контейнер так же предоставляет дополнительные утилиты, например JNDI, для управления пулом ресурсов.
☕️ Поддержка многопоточности. Контейнер самостоятельно создает новую нить для каждого запроса и предоставляет ей запрос и ответ для обработки. Таким образом сервлет не инициализируется заново для каждого запроса и тем самым сохраняет память и уменьшает время до обработки запроса.
☕️ Поддержка JSP. JSP классы не похожи на стандартные классы джавы, но контейнер сервлетов преобразует каждую JSP в сервлет и далее управляется контейнером как обычным сервлетом.
☕️ Различные задачи. Контейнер сервлетов управляет пулом ресурсов, памятью приложения, сборщиком мусора. Предоставляются возможности настройки безопасности и многое другое.
Сборщик мусора (Garbage Collector) должен делать всего две вещи:
☕️ Находить мусор - неиспользуемые объекты. (Объект считается неиспользуемым, если ни одна из сущностей в коде, выполняемом в данный момент, не содержит ссылок на него, либо цепочка ссылок, которая могла бы связать объект с некоторой сущностью приложения, обрывается);
☕️ Освобождать память от мусора.

Существуют два подхода к обнаружению мусора:
☕️ Reference counting;
☕️ Tracing.

Reference counting (подсчёт ссылок). Суть этого подхода состоит в том, что каждый объект имеет счетчик. Счетчик хранит информацию о том, сколько ссылок указывает на объект. Когда ссылка уничтожается, счетчик уменьшается. Если значение счетчика равно нулю, - объект можно считать мусором. Главным минусом такого подхода является сложность обеспечения точности счетчика. Также при таком подходе сложно выявлять циклические зависимости (когда два объекта указывают друг на друга, но ни один живой объект на них не ссылается), что приводит к утечкам памяти.

Главная идея подхода Tracing (трассировка) состоит в утверждении, что живыми могут считаться только те объекты, до которых мы можем добраться из корневых точек (GC Root) и те объекты, которые доступны с живого объекта. Всё остальное - мусор.

Существует 4 типа корневых точки:
☕️ Локальные переменные и параметры методов;
☕️ Потоки;
☕️ Статические переменные;
☕️ Ссылки из JNI.

Самое простое java приложение будет иметь корневые точки:
☕️ Локальные переменные внутри main() метода и параметры main() метода;
☕️ Поток, который выполняет main();
☕️ Статические переменные класса, внутри которого находится main() метод.

Таким образом, если мы представим все объекты и ссылки между ними как дерево, то нам нужно будет пройти с корневых узлов (точек) по всем рёбрам. При этом узлы, до которых мы сможем добраться - не мусор, все остальные - мусор. При таком подходе циклические зависимости легко выявляются. HotSpot VM использует именно такой подход.
#вопросы_с_собеседований
Какое из следующих утверждений о потоках неверно?
☕️ Если метод start() вызывается дважды для одного и того же объекта Thread, во время выполнения генерируется исключение.
☕️ Порядок, в котором запускались потоки, может не совпадать с порядком их фактического выполнения.
☕️ Если метод run() вызывается напрямую для объекта Thread, во время выполнения генерируется исключение.
☕️ Если метод sleep() вызывается для потока, во время выполнения синхронизированного кода, блокировка не снимается.
Правильный ответ: 3. Если метод run() вызывается напрямую для объекта Thread, во время выполнения исключение не генерируется. Однако, код, написанный в методе run() будет выполняться текущим, а не новым потоком. Таким образом, правильный способ запустить поток – это вызов метода start(), который приводит к выполнению метода run() новым потоком.

Вызов метода start() дважды для одного и того же объекта Thread приведёт к генерированию исключения IllegalThreadStateException во время выполнения, следовательно, утверждение 1 верно. Утверждение 2 верно, так как порядок, в котором выполняются потоки, определяется Планировщиком потоков, независимо от того, какой поток запущен первым. Утверждение 4 верно, так как поток не освободит блокировки, которые он держит, когда он переходит в состояние Ожидания.
Почему нельзя соглашаться на тестовый кодинг во время собеседования

Собеседования по программной инженерии часто включают в себя какое-то тестовое задание по программированию, и это не очень хорошо. Объясним, почему.

https://proglib.io/sh/2kaXGotdi0
Хочешь начать карьеру Java-разработчика? Наставники из Java Mentor подготовят тебя на позицию Java-программиста за 8 месяцев. Оплата только после успешного трудоустройства в IT.

Пройти входное тестирование🙋‍♂️👉 https://clck.ru/SkKyp

Ты освоишь востребованный стек технологий, получишь опыт в коммерческом проекте, а в конце программы менторы подготовят тебя к трудным вопросам на собеседовании и помогут составить конкурентное резюме. Тебя ждет высокая зарплата в топовых компаниях Москвы и минимум 10 предложений о работе.
This media is not supported in your browser
VIEW IN TELEGRAM
Приглашаем на бесплатную образовательную программу Тинькофф Финтех по направлениям: Java, Scala, Kotlin.

Занятия стартуют 8 февраля и продлятся 3 месяца. Все будет онлайн, поэтому география — вся Россия. Для поступления необходимо успешно сдать вступительные испытания. Участников программы ждет много практики, актуальных задач, интересных и обязательных к выполнению домашних заданий.

Заявки принимаем до 27 января, экзамены пройдут с 21 по 27 января. Рекомендуем не откладывать все на последний день и отправлять заявку в ближайшее время: https://fintech.tinkoff.ru/study/fintech/
Кроме того, очень важно сразу же зарегистрироваться в личном кабинете, там будут проходить экзамены: https://fintech.tinkoff.ru/sign-in
java.time.ZonedDateTime — аналог java.util.Calendar, класс с самым полным объемом информации о временном контексте в календарной системе ISO-8601. Включает временную зону, поэтому все операции с временными сдвигами этот класс проводит с её учётом.
☕️ Топ-10 книг по Java, вышедших за последние два года

Подборка лучших книг последних двух лет для тех, кто хочет вывести свои навыки в Java на новый уровень. В них вы найдете экспертные советы от лидеров. Только читая книги можно взглянуть на проблемы иначе, изучить новые техники и стать востребованным специалистом.

https://proglib.io/sh/9R8tIo0ZNn
🐛 ТОП-7 признаков неопытного программиста

Зная эти признаки, вы сможете избежать распространенных среди неопытных программистов ошибок и будете эффективнее строить карьеру разработчика.

https://proglib.io/sh/CZOPJGkxfo
Метод filter() является промежуточной операцией, принимающей предикат, который фильтрует все элементы, возвращая только те, что соответствуют условию.
#вопросы_с_собеседований
Можно ли объявить метод абстрактным и статическим одновременно?
Нет. В таком случае компилятор выдаст ошибку: "Illegal combination of modifiers: ‘abstract’ and ‘static’". Модификатор abstract говорит, что метод будет реализован в другом классе, а static наоборот указывает, что этот метод будет доступен по имени класса.
#вопросы_с_собеседований
Существует ли возможность перенаправить потоки стандартного ввода/вывода?
Класс System позволяет вам перенаправлять стандартный ввод, вывод и поток вывода ошибок, используя простой вызов статического метода:

☕️ setIn(InputStream) - для ввода;
☕️ setOut(PrintStream) - для вывода;
☕️ setErr(PrintStream) - для вывода ошибок.