#вопросы_с_собеседований
Согласно Кнуту и Кормену существует две основных реализации хэш-таблицы: на основе открытой адресации и на основе метода цепочек. Как реализована HashMap? Почему, по вашему мнению, была выбрана именно эта реализация? В чем плюсы и минусы каждого подхода?
Для метода цепочек коэффициент заполнения может быть больше 1 и с увеличением числа элементов производительность убывает линейно. Такие таблицы удобно использовать, если заранее неизвестно количество хранимых элементов, либо их может быть достаточно много, что приводит к большим значениям коэффициента заполнения.
Среди методов открытой реализации различают:
• линейное пробирование;
• квадратичное пробирование;
• двойное хэширование.
Недостатки структур с методом открытой адресации:
• Количество элементов в хэш-таблице не может превышать размера массива. По мере увеличения числа элементов и повышения коэффициента заполнения производительность структуры резко падает, поэтому необходимо проводить перехэширование.
• Сложно организовать удаление элемента.
• Первые два метода открытой адресации приводят к проблеме первичной и вторичной группировок.
Преимущества хэш-таблицы с открытой адресацией:
• отсутствие затрат на создание и хранение объектов списка;
• простота организации сериализации/десериализации
Согласно Кнуту и Кормену существует две основных реализации хэш-таблицы: на основе открытой адресации и на основе метода цепочек. Как реализована HashMap? Почему, по вашему мнению, была выбрана именно эта реализация? В чем плюсы и минусы каждого подхода?
HashMap
реализован с использованием метода цепочек, т.е. каждой ячейке массива (корзине) соответствует свой связный список и при возникновении коллизии осуществляется добавление нового элемента в этот список.Для метода цепочек коэффициент заполнения может быть больше 1 и с увеличением числа элементов производительность убывает линейно. Такие таблицы удобно использовать, если заранее неизвестно количество хранимых элементов, либо их может быть достаточно много, что приводит к большим значениям коэффициента заполнения.
Среди методов открытой реализации различают:
• линейное пробирование;
• квадратичное пробирование;
• двойное хэширование.
Недостатки структур с методом открытой адресации:
• Количество элементов в хэш-таблице не может превышать размера массива. По мере увеличения числа элементов и повышения коэффициента заполнения производительность структуры резко падает, поэтому необходимо проводить перехэширование.
• Сложно организовать удаление элемента.
• Первые два метода открытой адресации приводят к проблеме первичной и вторичной группировок.
Преимущества хэш-таблицы с открытой адресацией:
• отсутствие затрат на создание и хранение объектов списка;
• простота организации сериализации/десериализации
Что такое естественный порядок элементов коллекции?
Anonymous Quiz
22%
Порядок, в котором элементы располагаются в памяти
42%
Порядок, который получается при добавлении элементов кодом
10%
Порядок, обеспечиваемый работой пользовательского компаратора
26%
Порядок, который обеспечивается JVM
Please open Telegram to view this post
VIEW IN TELEGRAM
Не самые очевидные советы по написанию DTO на Java
Сегодня приложения зачастую имеют распределенный характер. Для подключения к другим сервисам нужно писать больше кода — и при этом стараться сделать его простым.
Чтобы воспользоваться данными из внешней службы, мы обычно преобразуем полезную нагрузку JSON в объект передачи данных (Data Transfer Object, DTO). Код, обрабатывающий DTO, быстро усложняется, но с этим могут помочь несколько советов. Вполне возможно писать DTO, с которыми легче взаимодействовать и которые облегчают написание и чтение кода. Если объединить их вместе — можно упростить себе работу.
Читать статью
Сегодня приложения зачастую имеют распределенный характер. Для подключения к другим сервисам нужно писать больше кода — и при этом стараться сделать его простым.
Чтобы воспользоваться данными из внешней службы, мы обычно преобразуем полезную нагрузку JSON в объект передачи данных (Data Transfer Object, DTO). Код, обрабатывающий DTO, быстро усложняется, но с этим могут помочь несколько советов. Вполне возможно писать DTO, с которыми легче взаимодействовать и которые облегчают написание и чтение кода. Если объединить их вместе — можно упростить себе работу.
Читать статью
NOP::Nuances of programming
Не самые очевидные советы по написанию DTO на Java
Как облегчить себе жизнь при работе с Data Transfer Object: создаем неизменяемые DTO, избегаем нулевых значений и упрощаем инициализацию, руководствуясь книгой "Java: эффективное программирование".
#вопросы_с_собеседований
Что такое «блокирующий метод»?
Блокирующий метод – метод, который блокируется, до тех пор, пока задание не выполнится, например метод accept() у ServerSocket блокируется в ожидании подключения клиента. Здесь блокирование означает, что контроль не вернётся к вызывающему методу до тех пор, пока не выполнится задание. Так же существуют асинхронные или неблокирующиеся методы, которые могут завершится до выполнения задачи.
Что такое «блокирующий метод»?
Блокирующий метод – метод, который блокируется, до тех пор, пока задание не выполнится, например метод accept() у ServerSocket блокируется в ожидании подключения клиента. Здесь блокирование означает, что контроль не вернётся к вызывающему методу до тех пор, пока не выполнится задание. Так же существуют асинхронные или неблокирующиеся методы, которые могут завершится до выполнения задачи.
#вопросы_с_собеседований
Какие типы ключевых слов используются в обработке исключений Java?
☕️ try
☕️catch
☕️finally
☕️throw
☕️throws
Какие типы ключевых слов используются в обработке исключений Java?
☕️ try
☕️catch
☕️finally
☕️throw
☕️throws
#вопросы_с_собеседований
Как работает HashMap при попытке сохранить в него два элемента по ключам с одинаковым hashCode(), но для которых equals() == false?
По значению
Как работает HashMap при попытке сохранить в него два элемента по ключам с одинаковым hashCode(), но для которых equals() == false?
По значению
hashCode()
вычисляется индекс ячейки массива, в список которой этот элемент будет добавлен. Перед добавлением осуществляется проверка на наличие элементов в этой ячейке. Если элементы с таким hashCode()
уже присутствует, но их equals()
методы не равны, то элемент будет добавлен в конец списка.Может ли объект получить доступ к члену класса, объявленному как private? Если да, то каким образом?
☕️ Внутри класса доступ к приватной переменной открыт без ограничений;
☕️ Вложенный класс имеет полный доступ ко всем (в том числе и приватным) членам содержащего его класса;
☕️ Доступ к приватным переменным извне может быть организован через отличные от приватных методов, которые предоставлены разработчиком класса. Например: getX() и setX().
☕️ Через механизм рефлексии (Reflection API) (см картинку). Не рекомендуется использовать в проектах.
☕️ Внутри класса доступ к приватной переменной открыт без ограничений;
☕️ Вложенный класс имеет полный доступ ко всем (в том числе и приватным) членам содержащего его класса;
☕️ Доступ к приватным переменным извне может быть организован через отличные от приватных методов, которые предоставлены разработчиком класса. Например: getX() и setX().
☕️ Через механизм рефлексии (Reflection API) (см картинку). Не рекомендуется использовать в проектах.
Бесплатный курс для всех, кто любит качественные IT-публикации и хочет научиться интересно писать о программировании либо улучшить навыки письма.
Курс состоит из семи модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций. Ограничений на время прохождения заданий нет.
Курс будет интересен авторам, работающим в составе редакции, копирайтерам-одиночкам и просто программистам, которые хотят научиться интересно рассказывать о собственных проектах.
Материалы регулярно дополняются, обновляются и корректируется. Отвечаем на все учебные вопросы в комментариях курса.
Как стать автором «Библиотеки программиста» и получать гонорары за статьи?
➡️ Заполните анкету.
Если все ок, мы свяжемся с вами и обсудим дальнейшие шаги.
Please open Telegram to view this post
VIEW IN TELEGRAM
Вы когда-нибудь искали подробное введение в Maven, которое было бы веселым и интересным одновременно? Тогда вы его нашли.
В этом видео вы узнаете, как использовать Maven как профессионал: установка, использование Maven вместе с IDE, основы Maven и многое другое.
В этом видео вы узнаете, как использовать Maven как профессионал: установка, использование Maven вместе с IDE, основы Maven и многое другое.
YouTube
Maven Tutorial - Crash Course
Ever looked for a comprehensive intro to Maven that is fun and entertaining at the same time? Then have a look at this brand-new episode of "Marco Codes": Maven Tutorial [Crash Course].
In this video, you'll learn how to use Maven like a professional: installations…
In this video, you'll learn how to use Maven like a professional: installations…
#вопросы_с_собеседований
Приведите примеры структурных шаблонов проектирования.
Адаптер (Adapter) — объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс.
Мост (Bridge) — структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо.
Компоновщик (Composite) — объект, который объединяет в себе объекты, подобные ему самому.
Декоратор (Decorator) — класс, расширяющий функциональность другого класса без использования наследования.
Фасад (Facade) — объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое.
Приспособленец (Flyweight) — это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым.
Заместитель (Proxy) — объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него.
Приведите примеры структурных шаблонов проектирования.
Адаптер (Adapter) — объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс.
Мост (Bridge) — структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо.
Компоновщик (Composite) — объект, который объединяет в себе объекты, подобные ему самому.
Декоратор (Decorator) — класс, расширяющий функциональность другого класса без использования наследования.
Фасад (Facade) — объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое.
Приспособленец (Flyweight) — это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым.
Заместитель (Proxy) — объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него.
#вопросы_с_собеседований
В чем отличия ServletContext и ServletConfig?
☕️ ServletConfig уникален для сервлета, а ServletContext - для приложения;
☕️ ServletConfig используется для предоставления параметров инициализации конкретному сервлету, а ServletContext для предоставления параметров инициализации для всех сервлетов приложения;
☕️ для ServletConfig возможности модифицировать атрибуты отсутствуют, атрибуты в объекте ServletContext можно изменять.
В чем отличия ServletContext и ServletConfig?
☕️ ServletConfig уникален для сервлета, а ServletContext - для приложения;
☕️ ServletConfig используется для предоставления параметров инициализации конкретному сервлету, а ServletContext для предоставления параметров инициализации для всех сервлетов приложения;
☕️ для ServletConfig возможности модифицировать атрибуты отсутствуют, атрибуты в объекте ServletContext можно изменять.
#вопросы_с_собеседований
Приведите примеры структурных шаблонов проектирования.
Адаптер (Adapter) — объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс.
Мост (Bridge) — структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо.
Компоновщик (Composite) — объект, который объединяет в себе объекты, подобные ему самому.
Декоратор (Decorator) — класс, расширяющий функциональность другого класса без использования наследования.
Фасад (Facade) — объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое.
Приспособленец (Flyweight) — это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым.
Заместитель (Proxy) — объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него.
Приведите примеры структурных шаблонов проектирования.
Адаптер (Adapter) — объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс.
Мост (Bridge) — структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо.
Компоновщик (Composite) — объект, который объединяет в себе объекты, подобные ему самому.
Декоратор (Decorator) — класс, расширяющий функциональность другого класса без использования наследования.
Фасад (Facade) — объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое.
Приспособленец (Flyweight) — это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым.
Заместитель (Proxy) — объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него.
#вопросы_с_собеседований
В чем разница между sleep() и wait(), notify() и notifyAll() методами?
Метод sleep()заставляет поток "заснуть" на определенное время(указывается в миллисекундах) после чего поток продолжит свою работу. Метод wait() освобождает монитор занятый потоком так что другие потоки могут использовать указанный блок кода и поток переходит в состояние waiting - поток будет ждать вызова метода notify() или notifyAll() другим потоком. Разница между notify() и notifyAll()в том что notify() "высвободит" один поток(какой именно определить нельзя) а notifyAll() "освободит" все потоки из состояния waiting в состояние running.
В чем разница между sleep() и wait(), notify() и notifyAll() методами?
Метод sleep()заставляет поток "заснуть" на определенное время(указывается в миллисекундах) после чего поток продолжит свою работу. Метод wait() освобождает монитор занятый потоком так что другие потоки могут использовать указанный блок кода и поток переходит в состояние waiting - поток будет ждать вызова метода notify() или notifyAll() другим потоком. Разница между notify() и notifyAll()в том что notify() "высвободит" один поток(какой именно определить нельзя) а notifyAll() "освободит" все потоки из состояния waiting в состояние running.
#вопросы_с_собеседований
Что такое ViewResolver в Spring?
Реализации ViewResolver используются для разрешения страниц просмотра по имени. Мы настраиваем его в файле конфигурации bean-компонента spring. Пример на картинке.
InternalResourceViewResolver — это одна из реализаций интерфейса ViewResolver, и мы предоставляем каталог страниц просмотра и местоположение через свойства компонента. Таким образом, если метод обработчика контроллера возвращает «home», view resolver будет использовать страницу представления, расположенную по адресу /WEB-INF/views/home.jsp.
Что такое ViewResolver в Spring?
Реализации ViewResolver используются для разрешения страниц просмотра по имени. Мы настраиваем его в файле конфигурации bean-компонента spring. Пример на картинке.
InternalResourceViewResolver — это одна из реализаций интерфейса ViewResolver, и мы предоставляем каталог страниц просмотра и местоположение через свойства компонента. Таким образом, если метод обработчика контроллера возвращает «home», view resolver будет использовать страницу представления, расположенную по адресу /WEB-INF/views/home.jsp.
Как сделать ссылки на методы дружелюбными для отладки
В Java 8 появилось два вида функциональных выражений — лямбда-выражения вида s -> System.out.println(s) и ссылки на методы вида System.out::println. Поначалу ссылки на методы вызывали больше энтузиазма: они часто компактнее, вам не требуется придумывать имя для переменной, а ещё старожилы говорят, что они несколько оптимальнее, чем лямбда-выражения. Однако со временем энтузиазм ослаб. Одна из проблем со ссылками на методы — затруднённая отладка ошибок.
https://habr.com/ru/post/568966/
В Java 8 появилось два вида функциональных выражений — лямбда-выражения вида s -> System.out.println(s) и ссылки на методы вида System.out::println. Поначалу ссылки на методы вызывали больше энтузиазма: они часто компактнее, вам не требуется придумывать имя для переменной, а ещё старожилы говорят, что они несколько оптимальнее, чем лямбда-выражения. Однако со временем энтузиазм ослаб. Одна из проблем со ссылками на методы — затруднённая отладка ошибок.
https://habr.com/ru/post/568966/
Хабр
Как сделать ссылки на методы дружелюбными для отладки
В Java 8 появилось два вида функциональных выражений — лямбда-выражения вида s -> System.out.println(s) и ссылки на методы вида System.out::println. Поначалу ссылки на методы вызывали больше...
#вопросы_с_собеседований
Что имеется в виду под Collections в Java?
Collection — это фреймворк, который создан для сохранения и манипуляции объектами.
Используется для выполнения следующих операций:
☕️ поиск;
☕️ сортировка;
☕️ манипуляция;
☕️ добавление;
☕️ удаление.
Все классы и интерфейсы для Collection фреймворка находятся в java.util пакете.
Что имеется в виду под Collections в Java?
Collection — это фреймворк, который создан для сохранения и манипуляции объектами.
Используется для выполнения следующих операций:
☕️ поиск;
☕️ сортировка;
☕️ манипуляция;
☕️ добавление;
☕️ удаление.
Все классы и интерфейсы для Collection фреймворка находятся в java.util пакете.