Java-разработчики ЦВТ создают сервисы для наших ключевых клиентов: самой дорогой компании Рунета, крупнейшего частного банка в России и онлайн-банка в мире.
Приглашаем тебя вместе с нами создавать продукты с миллионами пользователей и петабайтами данных.
Пиши @KhisamovaS, что ты от канала Библиотека джависта и стань частью одной из продуктовых команд.
Приглашаем тебя вместе с нами создавать продукты с миллионами пользователей и петабайтами данных.
Пиши @KhisamovaS, что ты от канала Библиотека джависта и стань частью одной из продуктовых команд.
#вопросы_с_собеседований
Как изменить стандартное поведение сериализации/десериализации?
• Реализовать интерфейс
• Если у сериализуемого объекта реализован один из следующих методов, то механизм сериализации будет использовать его, а не метод по умолчанию :
○
○
○
○
Как изменить стандартное поведение сериализации/десериализации?
• Реализовать интерфейс
java.io.Externalizable
, который позволяет применение пользовательской логики сериализации. Способ сериализации и десериализации описывается в методах writeExternal()
и readExternal()
. Во время десериализации вызывается конструктор без параметров, а потом уже на созданном объекте вызывается метод readExternal
.• Если у сериализуемого объекта реализован один из следующих методов, то механизм сериализации будет использовать его, а не метод по умолчанию :
○
writeObject()
- запись объекта в поток;○
readObject()
- чтение объекта из потока;○
writeReplace()
- позволяет заменить себя экземпляром другого класса перед записью;○
readResolve()
- позволяет заменить на себя другой объект после чтения.#вопросы_с_собеседований
Как написать immutable класс?
Чтоб написать immutable неизменяемый класс, нужно следовать простым пунктам:
⁃ сделать класс финальным.
⁃ сделать все поля приватными и создать только геттеры к ним. Сеттеры, разумеется, не нужно.
⁃ сделать все mutable поля final, чтобы установить значение можно было только один раз.
⁃ инициализировать все поля через конструктор, выполняя глубокое копирование (то есть, копируя и сам объект, и его переменные, и переменные переменных, и так далее).
⁃ клонировать объекты mutable переменных в геттерах, чтобы возвращать только копии значений, а не ссылки на актуальные объекты.
Как написать immutable класс?
Чтоб написать immutable неизменяемый класс, нужно следовать простым пунктам:
⁃ сделать класс финальным.
⁃ сделать все поля приватными и создать только геттеры к ним. Сеттеры, разумеется, не нужно.
⁃ сделать все mutable поля final, чтобы установить значение можно было только один раз.
⁃ инициализировать все поля через конструктор, выполняя глубокое копирование (то есть, копируя и сам объект, и его переменные, и переменные переменных, и так далее).
⁃ клонировать объекты mutable переменных в геттерах, чтобы возвращать только копии значений, а не ссылки на актуальные объекты.
#вопросы_с_собеседований
Что обозначает ключевое слово 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) — добавляет список объектов, начиная с определенного индекса.