#вопросы_с_собеседований
Что обозначает ключевое слово transient?
Поля класса, помеченные модификатором
Обычно в таких полях хранится промежуточное состояние объекта, которое, к примеру, проще вычислить. Другой пример такого поля - ссылка на экземпляр объекта, который не требует сериализации или не может быть сериализован.
Что обозначает ключевое слово transient?
Поля класса, помеченные модификатором
transient
, не сериализуются.Обычно в таких полях хранится промежуточное состояние объекта, которое, к примеру, проще вычислить. Другой пример такого поля - ссылка на экземпляр объекта, который не требует сериализации или не может быть сериализован.
#вопросы_с_собеседований
Какое влияние оказывают на сериализуемость модификаторы полей static и final?
При стандартной сериализации поля, имеющие модификатор
Поля с модификатором
Какое влияние оказывают на сериализуемость модификаторы полей static и final?
При стандартной сериализации поля, имеющие модификатор
static
, не сериализуются. Соответственно, после десериализации это поле значения не меняет. При использовании реализации Externalizable
сериализовать и десериализовать статическое поле можно, но не рекомендуется этого делать, т.к. это может сопровождаться трудноуловимыми ошибками.Поля с модификатором
final
сериализуются как и обычные. За одним исключением – их невозможно десериализовать при использовании Externalizable
, поскольку final
поля должны быть инициализированы в конструкторе, а после этого в readExternal()
изменить значение этого поля будет невозможно. Соответственно, если необходимо сериализовать объект с final
полем необходимо использовать только стандартную сериализацию.☕ Учебник по Java: списочный массив ArrayList
В продолжении серии постов о языке программировании Java поговорим об ArrayList. Для чего он нужен и как его использовать.
https://proglib.io/sh/q3vFKyklI0
В продолжении серии постов о языке программировании Java поговорим об ArrayList. Для чего он нужен и как его использовать.
https://proglib.io/sh/q3vFKyklI0
#вопросы_с_собеседований
Как создать собственный протокол сериализации?
Для создания собственного протокола сериализации достаточно реализовать интерфейс
Как создать собственный протокол сериализации?
Для создания собственного протокола сериализации достаточно реализовать интерфейс
Externalizable
, который содержит два метода:public void writeExternal(ObjectOutput out) throws IOException;
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
#вопросы_с_собеседований
Какая роль поля serialVersionUID в сериализации?
Когда мы не объявляем
Рекомендуется явно объявлять
Какая роль поля serialVersionUID в сериализации?
serialVersionUID
используется для указания версии сериализованных данных.Когда мы не объявляем
serialVersionUID
в нашем классе явно, среда выполнения Java
делает это за нас, но этот процесс чувствителен ко многим метаданным класса включая количество полей, тип полей, модификаторы доступа полей, интерфейсов, которые реализованы в классе и пр.Рекомендуется явно объявлять
serialVersionUID
т.к. при добавлении, удалении атрибутов класса динамически сгенерированное значение может измениться и в момент выполнения будет выброшено исключение InvalidClassException
.private static final long serialVersionUID = 20161013L;
Ищем будущих Java-разработчиков. Обучение и трудоустройство берём на себя.
От Вас:
— Желание стать востребованным IT-специалистом и зарабатывать от 100 000 руб/мес (по данным сайта HeadHunter).
— Наличие компьютера или ноутбука.
— Возможность уделять от 4 до 6 часов в неделю на обучение и немного упорства.
От нас:
— Знания, навыки и компетенции, которых, достаточно для позиции Middle-разработчика.
— Сильный преподавательский состав экспертов-практиков в IT-секторе.
— Стажировка в GeekBrains и трудоустройство после обучения.
Что нужно будет делать:
Java-разработчики занимаются разработкой высоконагруженных систем, веб-сервисов, банковских и корпоративных приложений, которыми пользуются люди по всему миру.
Освоить все необходимые навыки и стать востребованным Javistom уровня — middle вы можете на курсе «Факультет Java-разработки» с гарантированным трудоустройством от GeekBrains.
Курс идеально подойдёт, как для новичков, так и для разработчиков с опытом.
За 12 месяцев вы с нуля:
— Научитесь программировать на Java
— Освоите один из самых востребованных фреймворков для веб-разработки — Spring Framework
— Научитесь создавать приложения с помощью Spring Framework
— Освоите базовые знания верстки: HTML, CSS, Bootstrap
— Научитесь работать с базами данных SQL, PostgreSQL
— Получите навыки автоматизированного тестирования кода
— Получите знания по алгоритмам и структуре данных
По итогу обучения вы сможете создавать сетевые чаты, приложения, мобильные игры и другие сервисы.
И это ещё не всё!
Мы дарим подарки всем студентам:
— Изучение английского языка с Kespa
— Ключ от продуктов JetBrains
— Kaspersky Internet Security бесплатно на 90 дней
Пока вы читаете этот пост, кто-то уже записался на онлайн-курс «ФакультетJava-разработки».
Переходите по ссылке и оставляйте заявку: https://clc.to/LcmqSw
От Вас:
— Желание стать востребованным IT-специалистом и зарабатывать от 100 000 руб/мес (по данным сайта HeadHunter).
— Наличие компьютера или ноутбука.
— Возможность уделять от 4 до 6 часов в неделю на обучение и немного упорства.
От нас:
— Знания, навыки и компетенции, которых, достаточно для позиции Middle-разработчика.
— Сильный преподавательский состав экспертов-практиков в IT-секторе.
— Стажировка в GeekBrains и трудоустройство после обучения.
Что нужно будет делать:
Java-разработчики занимаются разработкой высоконагруженных систем, веб-сервисов, банковских и корпоративных приложений, которыми пользуются люди по всему миру.
Освоить все необходимые навыки и стать востребованным Javistom уровня — middle вы можете на курсе «Факультет Java-разработки» с гарантированным трудоустройством от GeekBrains.
Курс идеально подойдёт, как для новичков, так и для разработчиков с опытом.
За 12 месяцев вы с нуля:
— Научитесь программировать на Java
— Освоите один из самых востребованных фреймворков для веб-разработки — Spring Framework
— Научитесь создавать приложения с помощью Spring Framework
— Освоите базовые знания верстки: HTML, CSS, Bootstrap
— Научитесь работать с базами данных SQL, PostgreSQL
— Получите навыки автоматизированного тестирования кода
— Получите знания по алгоритмам и структуре данных
По итогу обучения вы сможете создавать сетевые чаты, приложения, мобильные игры и другие сервисы.
И это ещё не всё!
Мы дарим подарки всем студентам:
— Изучение английского языка с Kespa
— Ключ от продуктов JetBrains
— Kaspersky Internet Security бесплатно на 90 дней
Пока вы читаете этот пост, кто-то уже записался на онлайн-курс «ФакультетJava-разработки».
Переходите по ссылке и оставляйте заявку: https://clc.to/LcmqSw
#вопросы_с_собеседований
Что такое finalize()? Зачем он нужен?
Через вызов метода finalize() (который наследуется от Java.lang.Object) JVM реализуется функциональность, аналогичная функциональности деструкторов в С++, используемых для очистки памяти перед возвращением управления операционной системе. Данный метод вызывается при уничтожении объекта сборщиком мусора (garbage collector) и, переопределяя finalize(), можно запрограммировать действия, необходимые для корректного удаления экземпляра класса - например, закрытие сетевых соединений, соединений с базой данных, снятие блокировок на файлы и т.д.
После выполнения этого метода объект должен быть повторно собран сборщиком мусора (и это считается серьезной проблемой метода finalize() т.к. он мешает сборщику мусора освобождать память). Вызов этого метода не гарантируется, т.к. приложение может быть завершено до того, как будет запущена сборка мусора.
Объект не обязательно будет доступен для сборки сразу же - метод finalize() может сохранить куда-нибудь ссылку на объект. Подобная ситуация называется «возрождением» объекта и считается антипаттерном. Главная проблема такого трюка - в том, что «возродить» объект можно только один раз.
Что такое finalize()? Зачем он нужен?
Через вызов метода finalize() (который наследуется от Java.lang.Object) JVM реализуется функциональность, аналогичная функциональности деструкторов в С++, используемых для очистки памяти перед возвращением управления операционной системе. Данный метод вызывается при уничтожении объекта сборщиком мусора (garbage collector) и, переопределяя finalize(), можно запрограммировать действия, необходимые для корректного удаления экземпляра класса - например, закрытие сетевых соединений, соединений с базой данных, снятие блокировок на файлы и т.д.
После выполнения этого метода объект должен быть повторно собран сборщиком мусора (и это считается серьезной проблемой метода finalize() т.к. он мешает сборщику мусора освобождать память). Вызов этого метода не гарантируется, т.к. приложение может быть завершено до того, как будет запущена сборка мусора.
Объект не обязательно будет доступен для сборки сразу же - метод finalize() может сохранить куда-нибудь ссылку на объект. Подобная ситуация называется «возрождением» объекта и считается антипаттерном. Главная проблема такого трюка - в том, что «возродить» объект можно только один раз.
Как и когда происходит увеличение количества корзин в HashMap?
Помимо capacity у HashMap есть еще поле loadFactor, на основании которого, вычисляется предельное количество занятых корзин capacity * loadFactor. По умолчанию loadFactor = 0.75. По достижению предельного значения, число корзин увеличивается в 2 раза и для всех хранимых элементов вычисляется новое «местоположение» с учетом нового числа корзин.
Помимо capacity у HashMap есть еще поле loadFactor, на основании которого, вычисляется предельное количество занятых корзин capacity * loadFactor. По умолчанию loadFactor = 0.75. По достижению предельного значения, число корзин увеличивается в 2 раза и для всех хранимых элементов вычисляется новое «местоположение» с учетом нового числа корзин.
☕ Учебник по Java: cтатический и динамический полиморфизм
В статье разберемся с одной из ключевых концепций объектно-ориентированного программирования — полиморфизмом — и посмотрим, как она реализована в Java.
https://proglib.io/sh/EP9m8VGwae
В статье разберемся с одной из ключевых концепций объектно-ориентированного программирования — полиморфизмом — и посмотрим, как она реализована в Java.
https://proglib.io/sh/EP9m8VGwae
📱🇬🇧 ТОП-26 приложений для смартфонов для изучения английского с нуля
Подготовили список бесплатных и платных приложений, охватывающих все разделы английского языка: от изучения слов и сленга до анализа произношения и живого общения с иностранцами. Для удобства все приложения свели в сравнительную таблицу.
https://proglib.io/sh/6J9cDvsNUC
Подготовили список бесплатных и платных приложений, охватывающих все разделы английского языка: от изучения слов и сленга до анализа произношения и живого общения с иностранцами. Для удобства все приложения свели в сравнительную таблицу.
https://proglib.io/sh/6J9cDvsNUC
#вопросы_с_собеседований
Опишите поведение аннотации
1. Контейнер определяет тип объекта для внедрения
2. Контейнер ищет бины в контексте(он же контейнер), которые соответствуют нужному типу
3. Если есть несколько кандидатов, и один из них помечен как
4. Если используется аннотации
5. В противном случае контейнер попытается внедрить компонент, основываясь на его имени или ID
6. Если ни один из способов не сработал, то будет выброшено исключение
Контейнер обрабатывает DI с помощью AutowiredAnnotationBeanPostProcessor. В связи с этим, аннотация не может быть использована ни в одном BeanFactoryPP или BeanPP.
Если внедряемый объект массив, коллекция, или map с дженериком, то Spring внедрит все бины подходящие по типу в этот массив(или другую структуру данных). В случае с map ключом будет имя бина.
Опишите поведение аннотации
@Autowired
.1. Контейнер определяет тип объекта для внедрения
2. Контейнер ищет бины в контексте(он же контейнер), которые соответствуют нужному типу
3. Если есть несколько кандидатов, и один из них помечен как
@Primary
, то внедряется он4. Если используется аннотации
@Autowire
+ Qualifier, то контейнер будет использовать информацию из @Qualifier
, чтобы понять, какой компонент внедрять5. В противном случае контейнер попытается внедрить компонент, основываясь на его имени или ID
6. Если ни один из способов не сработал, то будет выброшено исключение
Контейнер обрабатывает DI с помощью AutowiredAnnotationBeanPostProcessor. В связи с этим, аннотация не может быть использована ни в одном BeanFactoryPP или BeanPP.
Если внедряемый объект массив, коллекция, или map с дженериком, то Spring внедрит все бины подходящие по типу в этот массив(или другую структуру данных). В случае с map ключом будет имя бина.
//параметр указывает, требуется ли DI
@Authowired(required = true/false)
🕸 Будущее интернета: как работают протоколы HTTP/3, QUIC и зачем они нужны?
Рассказываем об эволюции протокола HTTP, транспортном протоколе QUIC, преимуществах и недостатках HTTP/3 и, наконец, делимся мнением о будущем интернета благодаря HTTP/3.
https://proglib.io/sh/3wxFTAnr5H
Рассказываем об эволюции протокола HTTP, транспортном протоколе QUIC, преимуществах и недостатках HTTP/3 и, наконец, делимся мнением о будущем интернета благодаря HTTP/3.
https://proglib.io/sh/3wxFTAnr5H
🛠 Как использовать REST API: полное руководство для начинающих
Лонгрид о концепциях, особенностях стиля архитектуры и проблемах REST API.
https://proglib.io/sh/qlGMvA6ie8
Лонгрид о концепциях, особенностях стиля архитектуры и проблемах REST API.
https://proglib.io/sh/qlGMvA6ie8
#вопросы_с_собеседований
Какова важность файла web.xml в Spring MVC?
web.xml также известен как дескриптор развертывания, который содержит определения сервлетов и их сопоставлений, фильтров и прослушивателей жизненного цикла. Он также используется для настройки ContextLoaderListener. Всякий раз, когда приложение развертывается, экземпляр ContextLoaderListener создается контейнером сервлетов, что приводит к загрузке WebApplicationContext.
Какова важность файла web.xml в Spring MVC?
web.xml также известен как дескриптор развертывания, который содержит определения сервлетов и их сопоставлений, фильтров и прослушивателей жизненного цикла. Он также используется для настройки ContextLoaderListener. Всякий раз, когда приложение развертывается, экземпляр ContextLoaderListener создается контейнером сервлетов, что приводит к загрузке WebApplicationContext.
🥋 Что такое метанавыки и почему они важнее софт-скилов?
В статье рассмотрим, что такое мета-навыки, для чего они необходимы и почему вы должны уделять первоочередное внимание их развитию, чтобы реализоваться.
https://proglib.io/sh/WXEcg6wP3M
В статье рассмотрим, что такое мета-навыки, для чего они необходимы и почему вы должны уделять первоочередное внимание их развитию, чтобы реализоваться.
https://proglib.io/sh/WXEcg6wP3M
#вопросы_с_собеседований
Опишите поведение аннотации
1. Контейнер определяет тип объекта для внедрения
2. Контейнер ищет бины в контексте(он же контейнер), которые соответствуют нужному типу
3. Если есть несколько кандидатов, и один из них помечен как
4. Если используется аннотации
5. В противном случае контейнер попытается внедрить компонент, основываясь на его имени или ID
6. Если ни один из способов не сработал, то будет выброшено исключение
Контейнер обрабатывает DI с помощью AutowiredAnnotationBeanPostProcessor. В связи с этим, аннотация не может быть использована ни в одном BeanFactoryPP или BeanPP.
Если внедряемый объект массив, коллекция, или map с дженериком, то Spring внедрит все бины подходящие по типу в этот массив(или другую структуру данных). В случае с map ключом будет имя бина.
Опишите поведение аннотации
@Autowired
.1. Контейнер определяет тип объекта для внедрения
2. Контейнер ищет бины в контексте(он же контейнер), которые соответствуют нужному типу
3. Если есть несколько кандидатов, и один из них помечен как
@Primary
, то внедряется он4. Если используется аннотации
@Autowire
+ Qualifier, то контейнер будет использовать информацию из @Qualifier
, чтобы понять, какой компонент внедрять5. В противном случае контейнер попытается внедрить компонент, основываясь на его имени или ID
6. Если ни один из способов не сработал, то будет выброшено исключение
Контейнер обрабатывает DI с помощью AutowiredAnnotationBeanPostProcessor. В связи с этим, аннотация не может быть использована ни в одном BeanFactoryPP или BeanPP.
Если внедряемый объект массив, коллекция, или map с дженериком, то Spring внедрит все бины подходящие по типу в этот массив(или другую структуру данных). В случае с map ключом будет имя бина.
//параметр указывает, требуется ли DI
@Authowired(required = true/false)
#вопросы_с_собеседований
В чем проблема сериализации Singleton?
Проблема в том что после десериализации мы получим другой объект. Таким образом, сериализация дает возможность создать
• явный запрет сериализации.
• определение метода с сигнатурой (
В чем проблема сериализации Singleton?
Проблема в том что после десериализации мы получим другой объект. Таким образом, сериализация дает возможность создать
Singleton
еще раз, что недопустимо. Существует два способа избежать этого:• явный запрет сериализации.
• определение метода с сигнатурой (
default/public/private/protected/
) Object readResolve() throws ObjectStreamException
, назначением которого станет возврат замещающего объекта вместо объекта, на котором он вызван.#вопросы_с_собеседований
Что такое перегрузка методов?
Перегрузка методов — это свойство полиморфизма, в котором при помощи изменения сигнатуры метода можно создать различные реализации методов для одной и той же операции:
- одинаковое имя метода;
- различные аргументы;
- различный порядок аргументов;
Например, один и тот же add() из List может быть перегружен следующим образом и будет выполнять добавление разным способом, в зависимости от аргументов метода:
- add(Object o) — просто добавляет объект;
- add(int index, Object o) — добавляет объект в определенный индекс;
- add(Collection<Object> c) — добавляет список объектов;
- add(int index, Collection<Object> c) — добавляет список объектов, начиная с определенного индекса.
Что такое перегрузка методов?
Перегрузка методов — это свойство полиморфизма, в котором при помощи изменения сигнатуры метода можно создать различные реализации методов для одной и той же операции:
- одинаковое имя метода;
- различные аргументы;
- различный порядок аргументов;
Например, один и тот же add() из List может быть перегружен следующим образом и будет выполнять добавление разным способом, в зависимости от аргументов метода:
- add(Object o) — просто добавляет объект;
- add(int index, Object o) — добавляет объект в определенный индекс;
- add(Collection<Object> c) — добавляет список объектов;
- add(int index, Collection<Object> c) — добавляет список объектов, начиная с определенного индекса.
#вопросы_с_собеседований
Что такое «потокобезопасность»?
Что такое «потокобезопасность»?
Потокобезопасность
– свойство объекта или кода, которое гарантирует, что при исполнении или использовании несколькими потоками, код будет вести себя, как предполагается. Например потокобезопасный счётчик не пропустит ни один счёт, даже если один и тот же экземпляр этого счётчика будет использоваться несколькими потоками.#вопросы_с_собеседований
Что такое «кооперативная многозадачность»? Какой тип многозадачности использует Java? Чем обусловлен этот выбор?
Преимущества такого подхода - простота реализации, меньшие накладные расходы на переключение контекста.
Недостатки - если один поток завис или ведет себя некорректно, то зависает целиком вся система и другие потоки никогда не получат управление.
В отличие от кооперативной многозадачности управление операционной системе передаётся вне зависимости от состояния работающих приложений, благодаря чему, отдельные зависшие потоки процесса, как правило, не «подвешивают» всю систему целиком. За счёт регулярного переключения между задачами также улучшается отзывчивость приложения и повышается оперативность освобождения ресурсов, которые больше не используются.
В реализации вытесняющая многозадачность отличается от кооперативной, в частности, тем, что требует обработки системного прерывания от аппаратного таймера.
Что такое «кооперативная многозадачность»? Какой тип многозадачности использует Java? Чем обусловлен этот выбор?
Кооперативная многозадачность
- это способ деления процессорного времени между потоками, при котором каждый поток обязан отдавать управление следующему добровольно.Преимущества такого подхода - простота реализации, меньшие накладные расходы на переключение контекста.
Недостатки - если один поток завис или ведет себя некорректно, то зависает целиком вся система и другие потоки никогда не получат управление.
Java
использует вытесняющую многозадачность, при которой решение о переключении между потоками процесса принимает операционная система.В отличие от кооперативной многозадачности управление операционной системе передаётся вне зависимости от состояния работающих приложений, благодаря чему, отдельные зависшие потоки процесса, как правило, не «подвешивают» всю систему целиком. За счёт регулярного переключения между задачами также улучшается отзывчивость приложения и повышается оперативность освобождения ресурсов, которые больше не используются.
В реализации вытесняющая многозадачность отличается от кооперативной, в частности, тем, что требует обработки системного прерывания от аппаратного таймера.
Чем отличается процесс от потока?
Процесс — экземпляр программы во время выполнения, независимый объект, которому выделены системные ресурсы (например, процессорное время и память). Каждый процесс выполняется в отдельном адресном пространстве: один процесс не может получить доступ к переменным и структурам данных другого. Если процесс хочет получить доступ к чужим ресурсам, необходимо использовать межпроцессное взаимодействие. Это могут быть конвейеры, файлы, каналы связи между компьютерами и многое другое.
Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.
Поток(thread) — определенный способ выполнения процесса, определяющий последовательность исполнения кода в процессе. Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах. Так как потоки расходуют существенно меньше ресурсов, чем процессы, в процессе выполнения работы выгоднее создавать дополнительные потоки и избегать создания новых процессов.
Процесс — экземпляр программы во время выполнения, независимый объект, которому выделены системные ресурсы (например, процессорное время и память). Каждый процесс выполняется в отдельном адресном пространстве: один процесс не может получить доступ к переменным и структурам данных другого. Если процесс хочет получить доступ к чужим ресурсам, необходимо использовать межпроцессное взаимодействие. Это могут быть конвейеры, файлы, каналы связи между компьютерами и многое другое.
Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.
Поток(thread) — определенный способ выполнения процесса, определяющий последовательность исполнения кода в процессе. Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах. Так как потоки расходуют существенно меньше ресурсов, чем процессы, в процессе выполнения работы выгоднее создавать дополнительные потоки и избегать создания новых процессов.