Java-разработчики, новость для вас: с 5 по 20 августа на платформе All Cups пройдёт онлайн-чемпионат IT_One Cup.Java, организованный совместно Сколково и IT_ONE.
Вы сможете проверить свои силы в интересных задачах и выиграть денежные призы — до 250 тысяч рублей. К участию приглашаем разработчиков уровня Middle и Senior.
👉 Регистрируйтесь до 10 августа: https://vk.cc/cfb7Yg
🔹Участников ждёт два этапа — квалификационный раунд и финал. Задача — реализовать сервис, который соответствует определённому API и способен пройти все проверки тестирующей системы.
🔹Денежные призы получат первые пять мест, топ-20 участникам подарим мерч, а самых талантливых ребят пригласим на работу в компанию IT_ONE.
Вы сможете проверить свои силы в интересных задачах и выиграть денежные призы — до 250 тысяч рублей. К участию приглашаем разработчиков уровня Middle и Senior.
👉 Регистрируйтесь до 10 августа: https://vk.cc/cfb7Yg
🔹Участников ждёт два этапа — квалификационный раунд и финал. Задача — реализовать сервис, который соответствует определённому API и способен пройти все проверки тестирующей системы.
🔹Денежные призы получат первые пять мест, топ-20 участникам подарим мерч, а самых талантливых ребят пригласим на работу в компанию IT_ONE.
#вопросы_с_собеседований
Что такое «сериализация»?
Сериализация (Serialization) - процесс преобразования структуры данных в линейную последовательность байтов для дальнейшей передачи или сохранения. Сериализованные объекты можно затем восстановить (десериализовать).
В
Сериализация позволяет в определенных пределах изменять класс. Вот наиболее важные изменения, с которыми спецификация
• добавление в класс новых полей;
• изменение полей из статических в нестатические;
• изменение полей из транзитных в нетранзитные.
Обратные изменения (из нестатических полей в статические и из нетранзитных в транзитные) или удаление полей требуют определенной дополнительной обработки в зависимости от того, какая степень обратной совместимости необходима.
Что такое «сериализация»?
Сериализация (Serialization) - процесс преобразования структуры данных в линейную последовательность байтов для дальнейшей передачи или сохранения. Сериализованные объекты можно затем восстановить (десериализовать).
В
Java
, согласно спецификации Java Object Serialization
существует два стандартных способа сериализации: стандартная сериализация, через использование интерфейса java.io.Serializable
и «расширенная» сериализация - java.io.Externalizable
.Сериализация позволяет в определенных пределах изменять класс. Вот наиболее важные изменения, с которыми спецификация
Java Object Serialization
может справляться автоматически:• добавление в класс новых полей;
• изменение полей из статических в нестатические;
• изменение полей из транзитных в нетранзитные.
Обратные изменения (из нестатических полей в статические и из нетранзитных в транзитные) или удаление полей требуют определенной дополнительной обработки в зависимости от того, какая степень обратной совместимости необходима.
#вопросы_с_собеседований
Опишите процесс сериализации/десериализации с использованием Serializable.
При использовании
• запись в поток метаданных о классе, ассоциированном с объектом (имя класса, идентификатор
• рекурсивную запись в поток описания суперклассов до класса
• запись примитивных значений полей сериализуемого экземпляра, начиная с полей самого верхнего суперкласса;
• рекурсивную запись объектов, которые являются полями сериализуемого объекта.
При этом ранее сериализованные объекты повторно не сериализуются, что позволяет алгоритму корректно работать с циклическими ссылками.
Для выполнения десериализации под объект выделяется память, после чего его поля заполняются значениями из потока. Конструктор объекта при этом не вызывается. Однако при десериализации будет вызван конструктор без параметров родительского несериализуемого класса, а его отсутствие повлечёт ошибку десериализации.
Опишите процесс сериализации/десериализации с использованием Serializable.
При использовании
Serializable
применяется алгоритм сериализации, который с помощью рефлексии (Reflection API
) выполняет:• запись в поток метаданных о классе, ассоциированном с объектом (имя класса, идентификатор
SerialVersionUID
, идентификаторы полей класса);• рекурсивную запись в поток описания суперклассов до класса
java.lang.Object
(не включительно);• запись примитивных значений полей сериализуемого экземпляра, начиная с полей самого верхнего суперкласса;
• рекурсивную запись объектов, которые являются полями сериализуемого объекта.
При этом ранее сериализованные объекты повторно не сериализуются, что позволяет алгоритму корректно работать с циклическими ссылками.
Для выполнения десериализации под объект выделяется память, после чего его поля заполняются значениями из потока. Конструктор объекта при этом не вызывается. Однако при десериализации будет вызван конструктор без параметров родительского несериализуемого класса, а его отсутствие повлечёт ошибку десериализации.
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.