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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
Создание аналога Google Фото на Spring Boot

В этом видео автор показывает, как создать приложение, похожее на Google Фото, с помощью Spring Boot. Кроме того, вы узнаете много нового о Spring Dependency Injection и MVC frameworks, Validation and File Handling, Spring Data и базах данных, а также о том, как задеплоить свое приложение.
👍224👎2
#вопросы_с_собеседований
Какие существуют способы конфигурирования log4j?

Для того, чтобы log4j начал работать нужно предоставить ему конфигурацию. Это можно сделать несколькими путями:

Создать конфигурацию программно, т.е. получить logger, определить уровень журналирования, прикрепить appender и задать способ форматирования.
Указать файл или URL как аргумент при запуске java-машины -Dlog4j.configuration=путь/к/файлу/конфигурации, а затем прочитать его в программе при помощи PropertyConfigurator.configure(...)/ DOMConfigurator.configure(...) для формата .properties или XML соответственно.
Загрузить конфигурацию из файла в формате XML или .properties: log4j ищет файл конфигурации в classpath. Сначала ищется файл log4j.xml и, если таковой не найден, - файл log4j.properties.
👍16
Под каким типом хранить период времени?

В стандартной библиотеке современных версий Java для этих целей есть два класса:

Period – календарный период. Количество дней, месяцев и лет. Одним днем здесь считается день в терминах ZonedDateTime.

Duration – длительность времени. Количество наносекунд, секунд, минут, часов, и тоже дней. Здесь один день – ровно 24 часа.

Оба класса реализуют общий интерфейс TemporalAmount – период времени вообще. Оба иммутабельны, и как следствие, потокобезопасны. Любая модифицирующая операция вроде plusX() возвращает новый экземпляр с измененным значением.

Экземпляры обоих классов могут быть созданы из значений отдельных компонентов, из двух моментов времени методом between, или из строки. Строковое представление Duration: "P2DT3H4M", Period: "P1Y2M3D".

До Java 8 основным способом хранения периода были числовые примитивы. В этом подходе есть много недостатков, среди которых в первую очередь неограниченность значений и ненаглядность. Чтобы в Java 8+ получить период числом, используется метод between() нужного элемента енама ChronoUnit.
👍121
Как работают Тинькофф Центры Разработки ⚙️

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

Центры работают в 20 городах России, в Минске и в Казахстане — здесь начинает работать новый офис.

Эксперты Тинькофф расскажут, какие задачи решают команды, как выстроены процессы внутри них, о проектах и карьерном треке, по которому можно развиваться в Тинькофф.

Митап разделим по стримам: QA Backend & Mobile, Java, Android, iOS и .NET.

Встречу проведем в Zoom 19 мая. Ссылку на нее пришлем по почте после регистрации: https://l.tinkoff.ru/kz-development-centre-2022
👎13👍11🤔2
#вопросы_с_собеседований
Что произойдет при вызове Iterator.next() без предварительного вызова Iterator.hasNext()?

Если итератор указывает на последний элемент коллекции, то возникнет исключение NoSuchElementException, иначе будет возвращен следующий элемент.
👍24
Открытая трансляция главного зала HighLoad++ Foundation  13 и 14 мая!

Для просмотра необходима только регистрация: https://bit.ly/3sdkadM

Программа охватывает такие аспекты веб-разработок, как архитектуры крупных проектов, базы данных и системы хранения, devops и системное администрирование, нагрузочное тестирование, эксплуатация крупных проектов и другие направления, связанные с большими и высоконагруженными IT-системами.
👍5👎5🤔1
#вопросы_с_собеседований
Что такое ThreadLocal-переменная?

ThreadLocal - класс, позволяющий имея одну переменную, иметь различное её значение для каждого из потоков.

У каждого потока - т.е. экземпляра класса Thread - есть ассоциированная с ним таблица ThreadLocal-переменных. Ключами таблицы являются cсылки на объекты класса ThreadLocal, а значениями - ссылки на объекты, «захваченные» ThreadLocal-переменными, т.е. ThreadLocal-переменные отличаются от обычных переменных тем, что у каждого потока свой собственный, индивидуально инициализируемый экземпляр переменной. Доступ к значению можно получить через методы get() или set().

Например, если мы объявим ThreadLocal-переменную: ThreadLocal<Object> locals = new ThreadLocal<Object>();. А затем, в потоке, сделаем locals.set(myObject), то ключом таблицы будет ссылка на объект locals, а значением - ссылка на объект myObject. При этом для другого потока существует возможность «положить» внутрь locals другое значение.

Следует обратить внимание, что ThreadLocal изолирует именно ссылки на объекты, а не сами объекты. Если изолированные внутри потоков ссылки ведут на один и тот же объект, то возможны коллизии.

Так же важно отметить, что т.к. ThreadLocal-переменные изолированы в потоках, то инициализация такой переменной должна происходить в том же потоке, в котором она будет использоваться. Ошибкой является инициализация такой переменной (вызов метода set()) в главном потоке приложения, потому как в данном случае значение, переданное в методе set(), будет «захвачено» для главного потока, и при вызове метода get() в целевом потоке будет возвращен null.
👍26👎1🔥1
#вопросы_с_собеседований
Как поведёт себя коллекция, если вызвать iterator.remove()?

Если вызову iterator.remove() предшествовал вызов iterator.next(), то iterator.remove() удалит элемент коллекции, на который указывает итератор, в противном случае будет выброшено IllegalStateException().
👍17
Сравните Iterator и ListIterator.

ListIterator расширяет интерфейс Iterator
ListIterator может быть использован только для перебора элементов коллекции List;
Iterator позволяет перебирать элементы только в одном направлении, при помощи метода next(). Тогда как ListIterator позволяет перебирать список в обоих направлениях, при помощи методов next() и previous();
ListIterator не указывает на конкретный элемент: его текущая позиция располагается между элементами, которые возвращают методы previous() и next().
• При помощи ListIterator вы можете модифицировать список, добавляя/удаляя элементы с помощью методов add() и remove(). Iterator не поддерживает данного функционала.
👍29🔥3
Как избежать ConcurrentModificationException во время перебора коллекции?

• Попробовать подобрать или реализовать самостоятельно другой итератор, работающий по принципу fail-safe.
• Использовать ConcurrentHashMap и CopyOnWriteArrayList.
• Преобразовать список в массив и перебирать массив.
• Блокировать изменения списка на время перебора с помощью блока synchronized.
Отрицательная сторона последних двух вариантов - ухудшение производительности.
👍20👎2👾1
Какой существует эффективный способ удостовериться, что все сервлеты доступны только для пользователя с верной сессией?

Сервлет фильтры используются для перехвата всех запросов между контейнером сервлетов и сервлетом. Поэтому логично использовать соответствующий фильтр для проверки необходимой информации (например валидности сессии) в запросе.
👍5🤯1
#вопросы_с_собеседований
Какая коллекция реализует дисциплину обслуживания FIFO?

FIFO, First-In-First-Out («первым пришел-первым ушел»)
- по этому принципу построена коллекция Queue.
👍19😱3👎1
#вопросы_с_собеседований
Что такое «фикстуры»?

Фикстуры (fixtures) - состояние среды тестирования, которое требуется для успешного выполнения теста. Основная задача фикстур заключается в подготовке тестового окружения с заранее фиксированным/известным состоянием, чтобы гарантировать повторяемость процесса тестирования.
👍11
Как написать свой первый автотест за 1 час?

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

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

Занятие бесплатное — для участия вступайте в чат @qa_guru_chat — ссылка на занятие будет там.
👎9👍2
☕️ ТОП-20 бесплатных учебных курсов по Java для новичков

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

https://proglib.io/sh/O3826tAiV0
👍13👎5
Чем отличается ArrayList от LinkedList? В каких случаях лучше использовать первый, а в каких второй?

ArrayList это список, реализованный на основе массива, а LinkedList — это классический двусвязный список, основанный на объектах с ссылками между ними.

ArrayList:
• доступ к произвольному элементу по индексу за константное время O(1);
• доступ к элементам по значению за линейное время O(N);
• вставка в конец в среднем производится за константное время O(1);
• удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (capacity) не изменяется);
• вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку вправо;
• минимум накладных расходов при хранении.

LinkedList:
• на получение элемента по индексу или значению потребуется линейное время O(N);
• на добавление и удаление в начало или конец списка потребуется константное O(1);
• вставка или удаление в/из произвольного место константное O(1);
• требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка.

В целом, LinkedList в абсолютных величинах проигрывает ArrayList и по потребляемой памяти, и по скорости выполнения операций. LinkedList предпочтительно применять, когда нужны частые операции вставки/удаления или в случаях, когда необходимо гарантированное время добавления элемента в список.
👍42👎7🤔3🔥1
#вопросы_с_собеседований
Какое худшее время работы метода contains() для элемента, который есть в LinkedList?

O(N). Время поиска элемента линейно пропорционально количеству элементов в списке.
👍10🤯1
#вопросы_с_собеседований
Как происходит удаление элементов из ArrayList? Как меняется в этом случае размер ArrayList?

При удалении произвольного элемента из списка, все элементы, находящиеся «правее» смещаются на одну ячейку влево и реальный размер массива (его емкость, capacity) не изменяется никак. Механизм автоматического «расширения» массива существует, а вот автоматического «сжатия» нет, можно только явно выполнить «сжатие» командой trimToSize().
👍26
#вопросы_с_собеседований
Приведите примеры основных шаблонов проектирования.

☕️ Делегирование (Delegation pattern)
- Сущность внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту.
☕️ Функциональный дизайн (Functional design) - Гарантирует, что каждая сущность имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие.
☕️ Неизменяемый интерфейс (Immutable interface) - Создание неизменяемого объекта.
☕️ Интерфейс (Interface) - Общий метод структурирования сущностей, облегчающий их понимание.
☕️ Интерфейс-маркер (Marker interface) - В качестве атрибута (как пометки объектной сущности) применяется наличие или отсутствие реализации интерфейса-маркера. В современных языках программирования вместо этого применяются атрибуты или аннотации.
☕️ Контейнер свойств (Property container) - Позволяет добавлять дополнительные свойства сущности в контейнер внутри себя, вместо расширения новыми свойствами.
☕️ Канал событий (Event channel) - Создаёт централизованный канал для событий. Использует сущность-представитель для подписки и сущность-представитель для публикации события в канале. Представитель существует отдельно от реального издателя или подписчика. Подписчик может получать опубликованные события от более чем одной сущности, даже если он зарегистрирован только на одном канале.
👍15👎82
За день вряд ли исправишь сделанный впопыхах хардкод.
За день нельзя выкатить фичу, на которую нужна неделя, как бы ни умолял проджект.
Зато всего за день можно стать Java-разработчиком в одной из двух продуктовых команд Сбера, приняв участие в One Day Offer 21-22 мая.
 
Platform V
Основной элемент технологической стратегии Сбера, предоставляющий набор PAAS-сервисов для быстрого создания и развития бизнес-приложений в облаке.
 
Требования к участникам и условия работы смотрите здесь: http://sber.me/?p=vp3XM
👎21👍2
#вопросы_с_собеседований
Сколько необходимо дополнительной памяти при вызове ArrayList.add()?

Если в массиве достаточно места для размещения нового элемента, то дополнительной памяти не требуется. Иначе происходит создание нового массива размером в 1,5 раза превышающим существующий (это верно для JDK выше 1.7, в более ранних версиях размер увеличения иной).
👍9