В Java существует 4 типа ссылок: сильные (strong reference), мягкие (SoftReference), слабые (WeakReference) и фантомные (PhantomReference). Особенности каждого типа ссылок связаны с работой Garbage Collector. Если объект можно достичь только с помощью цепочки WeakReference (то есть на него отсутствуют сильные и мягкие ссылки), то данный объект будет помечен на удаление.
WeakHashMap - это структура данных, реализующая интерфейс Map и основанная на использовании WeakReference для хранения ключей. Таким образом, пара «ключ-значение» будет удалена из WeakHashMap, если на объект-ключ более не имеется сильных ссылок.
В качестве примера использования такой структуры данных можно привести следующую ситуацию: допустим имеются объекты, которые необходимо расширить дополнительной информацией, при этом изменение класса этих объектов нежелательно либо невозможно. В этом случае добавляем каждый объект в WeakHashMap в качестве ключа, а в качестве значения - нужную информацию. Таким образом, пока на объект имеется сильная ссылка (либо мягкая), можно проверять хэш-таблицу и извлекать информацию. Как только объект будет удален, то WeakReference для этого ключа будет помещен в ReferenceQueue и затем соответствующая запись для этой слабой ссылки будет удалена из WeakHashMap.
WeakHashMap - это структура данных, реализующая интерфейс Map и основанная на использовании WeakReference для хранения ключей. Таким образом, пара «ключ-значение» будет удалена из WeakHashMap, если на объект-ключ более не имеется сильных ссылок.
В качестве примера использования такой структуры данных можно привести следующую ситуацию: допустим имеются объекты, которые необходимо расширить дополнительной информацией, при этом изменение класса этих объектов нежелательно либо невозможно. В этом случае добавляем каждый объект в WeakHashMap в качестве ключа, а в качестве значения - нужную информацию. Таким образом, пока на объект имеется сильная ссылка (либо мягкая), можно проверять хэш-таблицу и извлекать информацию. Как только объект будет удален, то WeakReference для этого ключа будет помещен в ReferenceQueue и затем соответствующая запись для этой слабой ссылки будет удалена из WeakHashMap.
#вопросы_с_собеседований
Даны 3 потока: Т1, Т2 и Т3. Как реализовать выполнение в последовательности Т1, Т2, Т3?
Даны 3 потока: Т1, Т2 и Т3. Как реализовать выполнение в последовательности Т1, Т2, Т3?
Декабрьский интенсив по SRE🦎
Формат: онлайн-интенсив (Zoom, записи занятий, git, стенды для практики, техподдержка и помощь спикеров).
На интенсиве разбираем SRE-подход к разработке и эксплуатации высоконагруженного сайта:
✔️будем настраивать и поддерживать сайт из нескольких микросервисов.
✔️сформулируем показатели SLO, SLI, SLA, разработаем архитектуру и инфраструктуру, соберем, протестируем и задеплоим сайт, настроим мониторинг и алертинг.
✔️определим причины ухудшения SLO, разберем устойчивость, error budget, практику тестирования, управление прерываниями и операционной нагрузкой.
✔️проработаем порядок действий в случае аварии.
✔️примем решения по дальнейшему предотвращению инцидентов.
Дата интенсива: 11–13 декабря 2020
Программа и регистрация на сайте - https://slurm.club/2HOUErw
Формат: онлайн-интенсив (Zoom, записи занятий, git, стенды для практики, техподдержка и помощь спикеров).
На интенсиве разбираем SRE-подход к разработке и эксплуатации высоконагруженного сайта:
✔️будем настраивать и поддерживать сайт из нескольких микросервисов.
✔️сформулируем показатели SLO, SLI, SLA, разработаем архитектуру и инфраструктуру, соберем, протестируем и задеплоим сайт, настроим мониторинг и алертинг.
✔️определим причины ухудшения SLO, разберем устойчивость, error budget, практику тестирования, управление прерываниями и операционной нагрузкой.
✔️проработаем порядок действий в случае аварии.
✔️примем решения по дальнейшему предотвращению инцидентов.
Дата интенсива: 11–13 декабря 2020
Программа и регистрация на сайте - https://slurm.club/2HOUErw
❓ Можно ли заменить настольный компьютер на Raspberry Pi 4?
В этой статье познакомимся с Raspberry Pi 4 и ответим на вопрос, сможет ли «Малина» заменить десктоп. Спойлер: на 90% – нет.
https://proglib.io/sh/WEJoq7CyFV
В этой статье познакомимся с Raspberry Pi 4 и ответим на вопрос, сможет ли «Малина» заменить десктоп. Спойлер: на 90% – нет.
https://proglib.io/sh/WEJoq7CyFV
Spring Security in Action (2020)
Автор: Laurentiu Spilca
Количество страниц: 560
Автор показывает, как предотвратить атаки с использованием межсайтовых скриптов и подделки запросов до того, как они нанесут ущерб. Вы начнете с основ, моделируя обновление паролей и добавляя несколько типов авторизации. По мере роста ваших навыков вы адаптируете Spring к новым архитектурам и создадите расширенные конфигурации OAuth2. К концу работы с книгой у вас будет настроенная конфигурация, которая защитит от угроз.
Скачать книгу
Автор: Laurentiu Spilca
Количество страниц: 560
Автор показывает, как предотвратить атаки с использованием межсайтовых скриптов и подделки запросов до того, как они нанесут ущерб. Вы начнете с основ, моделируя обновление паролей и добавляя несколько типов авторизации. По мере роста ваших навыков вы адаптируете Spring к новым архитектурам и создадите расширенные конфигурации OAuth2. К концу работы с книгой у вас будет настроенная конфигурация, которая защитит от угроз.
Скачать книгу
Telegram
Книги для программистов (reserved)
Spring Security in Action (2020)
Автор: Laurentiu Spilca
Автор: Laurentiu Spilca
Начни карьеру востребованного Java разработчика с наставниками из Java Mentor. Гарантированное трудоустройство в IT и оплата только за результат, когда начнешь работать.
Пройти входное тестирование: https://clck.ru/SDmoi
Тебя ждет высокая зарплата в топовых компаниях Москвы и минимум 10 предложений о работе. А еще 2 года карьерной поддержки с бесплатной возможностью принимать участие в онлайн и оффлайн мероприятиях с экспертами рынка.
Пройти входное тестирование: https://clck.ru/SDmoi
Тебя ждет высокая зарплата в топовых компаниях Москвы и минимум 10 предложений о работе. А еще 2 года карьерной поддержки с бесплатной возможностью принимать участие в онлайн и оффлайн мероприятиях с экспертами рынка.
Ответ на вопрос
Такой последовательности выполнения можно достичь многими способами, например, просто воспользоваться методом join(), чтобы запустить поток в момент, когда другой уже закончит своё выполнение. Для реализации заданной последовательности, нужно запустить последний поток первым, и затем вызывать метод join() в обратном порядке, то есть Т3 вызывает Т2.join, а Т2 вызывает Т1.join, таким образом Т1 закончит выполнение первым, а Т3 последним.
Такой последовательности выполнения можно достичь многими способами, например, просто воспользоваться методом join(), чтобы запустить поток в момент, когда другой уже закончит своё выполнение. Для реализации заданной последовательности, нужно запустить последний поток первым, и затем вызывать метод join() в обратном порядке, то есть Т3 вызывает Т2.join, а Т2 вызывает Т1.join, таким образом Т1 закончит выполнение первым, а Т3 последним.
Telegram
Библиотека джависта
#вопросы_с_собеседований
Даны 3 потока: Т1, Т2 и Т3. Как реализовать выполнение в последовательности Т1, Т2, Т3?
Даны 3 потока: Т1, Т2 и Т3. Как реализовать выполнение в последовательности Т1, Т2, Т3?
#вопросы_с_собеседований
Будет ли работать HashMap, если все добавляемые ключи будут иметь одинаковый hashCode()?
Будет ли работать HashMap, если все добавляемые ключи будут иметь одинаковый hashCode()?
Разбираем принципы работы Spring Framework!
В субботу, 12 декабря, состоится онлайн мастер-класс «Пишем свой DI-контейнер на Java», организованный IT-компанией MediaSoft и онлайн-университетом Skillbox.
В программе:
• Познакомимся со структурой современного Java-приложения;
• Разберемся, что такое зависимости, как с ними работать, и какие преимущества дает их внедрение;
• Рассмотрим принцип инверсии управления и как с его помощью снизить связность компонентов и улучшить модульность и расширяемость ПО;
• Реализуем собственный DI-контейнер;
• Рассмотрим практическое применение некоторых паттернов проектирования;
• Ответим на ваши вопросы.
Для кого: для разработчиков начального и среднего уровня. Подойдет как тем, кто только начинает разбираться со Spring, так и тем, кто уже уверенно работает с ним. Необходим опыт разработки на Java.
Когда: 12 декабря (суббота), 12:00-15:00 по московскому времени
Для участия необходимо зарегистрироваться 👈
В субботу, 12 декабря, состоится онлайн мастер-класс «Пишем свой DI-контейнер на Java», организованный IT-компанией MediaSoft и онлайн-университетом Skillbox.
В программе:
• Познакомимся со структурой современного Java-приложения;
• Разберемся, что такое зависимости, как с ними работать, и какие преимущества дает их внедрение;
• Рассмотрим принцип инверсии управления и как с его помощью снизить связность компонентов и улучшить модульность и расширяемость ПО;
• Реализуем собственный DI-контейнер;
• Рассмотрим практическое применение некоторых паттернов проектирования;
• Ответим на ваши вопросы.
Для кого: для разработчиков начального и среднего уровня. Подойдет как тем, кто только начинает разбираться со Spring, так и тем, кто уже уверенно работает с ним. Необходим опыт разработки на Java.
Когда: 12 декабря (суббота), 12:00-15:00 по московскому времени
Для участия необходимо зарегистрироваться 👈
Ответ
Да, будет, но в этом случае HashMap вырождается в связный список и теряет свои преимущества.
Да, будет, но в этом случае HashMap вырождается в связный список и теряет свои преимущества.
Telegram
Библиотека джависта
#вопросы_с_собеседований
Будет ли работать HashMap, если все добавляемые ключи будут иметь одинаковый hashCode()?
Будет ли работать HashMap, если все добавляемые ключи будут иметь одинаковый hashCode()?
#вопросы_с_собеседований
Что будет, если очередь пула потоков уже заполнена, но подаётся новая задача?
Что будет, если очередь пула потоков уже заполнена, но подаётся новая задача?
Если очередь пула потоков заполнилась, то поданная задача будет «отклонена». Например - метод submit() у ThreadPoolExecutor выкидывает RejectedExecutionException, после которого вызывается RejectedExecutionHandler.
#вопросы_с_собеседований
1. Что произойдет при вызове Iterator.next() без предварительного вызова Iterator.hasNext()?
2. Сколько элементов будет пропущено, если Iterator.next() будет вызван после 10-ти вызовов Iterator.hasNext()?
1. Что произойдет при вызове Iterator.next() без предварительного вызова Iterator.hasNext()?
2. Сколько элементов будет пропущено, если Iterator.next() будет вызван после 10-ти вызовов Iterator.hasNext()?
1. Если итератор указывает на последний элемент коллекции, то возникнет исключение NoSuchElementException, иначе будет возвращен следующий элемент.
2. Нисколько - hasNext() осуществляет только проверку наличия следующего элемента.
2. Нисколько - hasNext() осуществляет только проверку наличия следующего элемента.
#вопросы_с_собеседований
Какими свойствами обладает порождаемое equals() отношение эквивалентности?
Какими свойствами обладает порождаемое equals() отношение эквивалентности?
☕️ Рефлексивность: для любой ссылки на значение x, x.equals(x) вернет true;
☕️ Симметричность: для любых ссылок на значения x и y, x.equals(y) должно вернуть true, тогда и только тогда, когда y.equals(x) возвращает true.
☕️ Транзитивность: для любых ссылок на значения x, y и z, если x.equals(y) и y.equals(z) возвращают true, тогда и x.equals(z) вернёт true;
☕️ Непротиворечивость: для любых ссылок на значения х и у, если несколько раз вызвать х.equals(y), постоянно будет возвращаться значение true либо постоянно будет возвращаться значение false при условии, что никакая информация, используемая при сравнении объектов, не поменялась.
Для любой ненулевой ссылки на значение х выражение х.equals(null) должно возвращать false.
☕️ Симметричность: для любых ссылок на значения x и y, x.equals(y) должно вернуть true, тогда и только тогда, когда y.equals(x) возвращает true.
☕️ Транзитивность: для любых ссылок на значения x, y и z, если x.equals(y) и y.equals(z) возвращают true, тогда и x.equals(z) вернёт true;
☕️ Непротиворечивость: для любых ссылок на значения х и у, если несколько раз вызвать х.equals(y), постоянно будет возвращаться значение true либо постоянно будет возвращаться значение false при условии, что никакая информация, используемая при сравнении объектов, не поменялась.
Для любой ненулевой ссылки на значение х выражение х.equals(null) должно возвращать false.
#вопросы_с_собеседований
Что из себя представляет JDBC URL?
Что из себя представляет JDBC URL?
JDBC URL состоит из:
☕️ <protocol>: (протокола) - всегда jdbc:.
☕️ <subprotocol>: (подпротокола) - это имя драйвера или имя механизма соединения с базой данных. Подпротокол может поддерживаться одним или несколькими драйверами. Лежащий на поверхности пример подпротокола - это "odbc", отведенный для URL, обозначающих имя источника данных ODBC. В случае необходимости использовать сервис имен (т.е. имя базы данных в JDBC URL не будет действительным именем базы данных), то подпротоколом может выступать сервис имен.
☕️ <subname> (подимени) - это идентификатор базы данных. Значение подимени может менятся в зависимости от подпротокола, и может также иметь под-подимя с синтаксисом, определяемым разработчиком драйвера. Назначение подимени - это предоставление всей информации, необходимой для поиска базы данных. Например, если база данных находится в Интернет, то в состав подимени JDBC URL должен быть включен сетевой адрес, подчиняющийся следующим соглашениям: //<hostname>:<port>/<subsubname.
Пример JDBC URL для подключения к MySQL базе данных «Test» расположенной по адресу localhost и ожидающей соединений по порту 3306: jdbc:mysql://localhost:3306/Test
☕️ <protocol>: (протокола) - всегда jdbc:.
☕️ <subprotocol>: (подпротокола) - это имя драйвера или имя механизма соединения с базой данных. Подпротокол может поддерживаться одним или несколькими драйверами. Лежащий на поверхности пример подпротокола - это "odbc", отведенный для URL, обозначающих имя источника данных ODBC. В случае необходимости использовать сервис имен (т.е. имя базы данных в JDBC URL не будет действительным именем базы данных), то подпротоколом может выступать сервис имен.
☕️ <subname> (подимени) - это идентификатор базы данных. Значение подимени может менятся в зависимости от подпротокола, и может также иметь под-подимя с синтаксисом, определяемым разработчиком драйвера. Назначение подимени - это предоставление всей информации, необходимой для поиска базы данных. Например, если база данных находится в Интернет, то в состав подимени JDBC URL должен быть включен сетевой адрес, подчиняющийся следующим соглашениям: //<hostname>:<port>/<subsubname.
Пример JDBC URL для подключения к MySQL базе данных «Test» расположенной по адресу localhost и ожидающей соединений по порту 3306: jdbc:mysql://localhost:3306/Test
#вопросы_с_собеседований
Опишите основные этапы работы с базой данных при использовании JDBC.
Опишите основные этапы работы с базой данных при использовании JDBC.