Какое из следующих утверждений верно для класса: java.util.ArrayList?
Anonymous Quiz
3%
Элементы коллекции гарантированно уникальные
5%
Коллекция гарантированно неизменная (immutable)
21%
Элементы в коллекции упорядочены.
20%
Элементы в коллекции доступны с помощью уникального ключа.
46%
Все варианты неверные
5%
Узнать ответ
👎41👍8
#вопросы_с_собеседований
Как обрабатывать исключения в Spring MVC Framework?
В Spring MVC интерфейс HandlerExceptionResolver (из пакета org.springframework.web.servlet) предназначен для работы с непредвиденными исключениями, возникающими во время выполнения обработчиков. По умолчанию DispatcherServlet регистрирует класс DefaultHandlerExceptionResolver (из пакета
Controller Based – указать методы для обработки исключения в классе контроллера. Для этого нужно пометить такие методы аннотацией
Global Exception Handler – для обработки глобальных исключений спринг предоставляет аннотацию
HandlerExceptionResolver implementation – Spring Framework предоставляет интерфейс HandlerExceptionResolver, который позволяет задать глобального обработчика исключений. Реализацию этого интерфейса можно использовать для создания собственных глобальных обработчиков исключений в приложении.
Подробнее
@javatg
Как обрабатывать исключения в Spring MVC Framework?
В Spring MVC интерфейс HandlerExceptionResolver (из пакета org.springframework.web.servlet) предназначен для работы с непредвиденными исключениями, возникающими во время выполнения обработчиков. По умолчанию DispatcherServlet регистрирует класс DefaultHandlerExceptionResolver (из пакета
org.springframework.web.servlet.mvc.support)
. Этот распознаватель обрабатывает определенные стандартные исключения Spring MVC, устанавливая специальный код состояния ответа. Можно также реализовать собственный обработчик исключений, аннотировав метод контроллера с помощью аннотации @ExceptionHandler
и передав ей в качестве атрибута тип исключения. В общем случае обработку исключений можно описать таким образом:Controller Based – указать методы для обработки исключения в классе контроллера. Для этого нужно пометить такие методы аннотацией
@ExceptionHandler
.Global Exception Handler – для обработки глобальных исключений спринг предоставляет аннотацию
@ControllerAdvice.
HandlerExceptionResolver implementation – Spring Framework предоставляет интерфейс HandlerExceptionResolver, который позволяет задать глобального обработчика исключений. Реализацию этого интерфейса можно использовать для создания собственных глобальных обработчиков исключений в приложении.
Подробнее
@javatg
👍12🔥2
✅ 1 год в качестве Java разработчика, опыт собеседований, зарплата, ответы на вопросы
https://www.youtube.com/watch?v=I1_nGjLxlNk
@javatg
https://www.youtube.com/watch?v=I1_nGjLxlNk
@javatg
YouTube
1 год в качестве Java разработчика, опыт собеседований, зарплата, ответы на вопросы
Мой курс для начинающих Java разработчиков (запущен в 2024):
- https://stepik.org/a/210257 - на stepik
- https://www.udemy.com/course/java-backend-with-nikiforovjava/?referralCode=D69F489FBE10102F6D5B - на udemy
Вы также можете приобрести один из курсов…
- https://stepik.org/a/210257 - на stepik
- https://www.udemy.com/course/java-backend-with-nikiforovjava/?referralCode=D69F489FBE10102F6D5B - на udemy
Вы также можете приобрести один из курсов…
👍7🔥1👏1
#вопросы_с_собеседований
Что такое класс Spring JdbcTemplate и как его использовать?
Шаблон Spring JDBC — это основной API, через который мы можем получить доступ к интересующей нас логике операций с базой данных:
☕️ Создание и закрытие соединений
☕️ Выполнение операторов и вызовы хранимых процедур
☕️ Итерация по ResultSet и возврат результатов
Чтобы использовать его, нам нужно определить простую конфигурацию DataSource:
Что такое класс Spring JdbcTemplate и как его использовать?
Шаблон Spring JDBC — это основной API, через который мы можем получить доступ к интересующей нас логике операций с базой данных:
☕️ Создание и закрытие соединений
☕️ Выполнение операторов и вызовы хранимых процедур
☕️ Итерация по ResultSet и возврат результатов
Чтобы использовать его, нам нужно определить простую конфигурацию DataSource:
@Configuration
@ComponentScan("org.smth.jdbc")
public class SpringJdbcConfig {
@Bean
public DataSource mysqlDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/springjdbc");
dataSource.setUsername("guest_user");
dataSource.setPassword("guest_password");
return dataSource;
}
}
@javatg
👍21
Как устроены атомики?
Начнем с того, что такое атомики и зачем нужны.
Условно можно разделить подходы реализации большинства atomic-методов на две группы: compare-and-set и set-and-get.
Методы категории compare-and-set принимают старое значение и новое. Если переданное старое значение совпало с текущим, устанавливается новое. Обычно делегируют вызов в методы класса
В случае set-and-get старое значение неизвестно. Поэтому нужен небольшой трюк: программа сначала считывает текущее значение, а затем записывает новое, тоже с помощью CAS, потому что запись могла успеть поменяться даже за этот шаг. Эта попытка чтения+записи повторяется в цикле, пока старое значение не совпадет и переменная не будет успешно записана.
Этот трюк называется double-checked или optimistic locking, и может быть использован и в пользовательском коде с любым способом синхронизации. Оптимистичность заключается в том, что мы надеемся что состояния гонки нет, прибегая к синхронизации только если гонка всё же случилась. Реализация оптимистичной блокировки может быть дана как отдельная задача.
#Многопоточность
@javatg
Начнем с того, что такое атомики и зачем нужны.
Atomic*
– семейство классов из java.util.concurrent
. Они предоставляют набор атомарных операций для соответствующих типов. Например с помощью методов getAndIncrement
/incrementAndGet
класса AtomicInteger
можно делать неатомарный в обычных условиях инкремент (i++
).Условно можно разделить подходы реализации большинства atomic-методов на две группы: compare-and-set и set-and-get.
Методы категории compare-and-set принимают старое значение и новое. Если переданное старое значение совпало с текущим, устанавливается новое. Обычно делегируют вызов в методы класса
Unsafe
, которые заменяются нативными реализациями виртуальной машины. Виртуальная машина в большинстве случаев использует атомарную операцию процессора compare-and-swap (CAS). Поэтому атомики обычно более эффективны чем стандартная дорогостоящая блокировка.В случае set-and-get старое значение неизвестно. Поэтому нужен небольшой трюк: программа сначала считывает текущее значение, а затем записывает новое, тоже с помощью CAS, потому что запись могла успеть поменяться даже за этот шаг. Эта попытка чтения+записи повторяется в цикле, пока старое значение не совпадет и переменная не будет успешно записана.
Этот трюк называется double-checked или optimistic locking, и может быть использован и в пользовательском коде с любым способом синхронизации. Оптимистичность заключается в том, что мы надеемся что состояния гонки нет, прибегая к синхронизации только если гонка всё же случилась. Реализация оптимистичной блокировки может быть дана как отдельная задача.
#Многопоточность
@javatg
👍12❤3🔥1
🏆 Java Concurrency или как работают потоки: применение на практике
Для того, чтобы успешно строить карьеру программиста, необходимо устроиться работать по соответствующей профессии, а также знать особенности языков программирования. Огромным спросом у разработчиков на данный момент пользуется Java. Это – кроссплатформенный универсальный вариант «общения» с компьютерами и программным обеспечением. Прост в освоении, обладает относительно понятным синтаксисом. Многофункционален, имеет возможность ООП.
Когда будущий разработчик проходит собеседование, ему задают разнообразные вопросы по коддингу. В случае с Java немаловажным моментом является тема потоков. Особенно многопоточности. Данная статья поможет разобраться в соответствующем направлении, а также составить приложение, использующее Java Concurrency.
➡️ Читать дальше
@javatg
Для того, чтобы успешно строить карьеру программиста, необходимо устроиться работать по соответствующей профессии, а также знать особенности языков программирования. Огромным спросом у разработчиков на данный момент пользуется Java. Это – кроссплатформенный универсальный вариант «общения» с компьютерами и программным обеспечением. Прост в освоении, обладает относительно понятным синтаксисом. Многофункционален, имеет возможность ООП.
Когда будущий разработчик проходит собеседование, ему задают разнообразные вопросы по коддингу. В случае с Java немаловажным моментом является тема потоков. Особенно многопоточности. Данная статья поможет разобраться в соответствующем направлении, а также составить приложение, использующее Java Concurrency.
➡️ Читать дальше
@javatg
👍7👎2🔥2
↪️ Java RegEx: применение регулярных выражений в коде
Рассмотрим регулярные выражения в Java, затронув синтаксис и наиболее популярные конструкции, а также продемонстрируем работу RegEx на примерах.
Основы регулярных выражений
Регулярные выражения в Java
Примеры использования регулярных выражений в Java
➡️ Читать дальше
@javatg
Рассмотрим регулярные выражения в Java, затронув синтаксис и наиболее популярные конструкции, а также продемонстрируем работу RegEx на примерах.
Основы регулярных выражений
Регулярные выражения в Java
Примеры использования регулярных выражений в Java
➡️ Читать дальше
@javatg
👍10👎1
#вопросы_с_собеседований
Назовите типы управления транзакциями, которые поддерживает Spring.
Spring поддерживает два типа управления транзакциями.
Программное управление транзакциями: в этом случае транзакция управляется с помощью программирования. Он обеспечивает исключительную гибкость, но его очень сложно поддерживать.
Декларативное управление транзакциями: при этом управление транзакциями отделено от бизнес-кода. Для управления транзакциями используются только аннотации или конфигурации на основе XML.
Подробнее
@javatg
Назовите типы управления транзакциями, которые поддерживает Spring.
Spring поддерживает два типа управления транзакциями.
Программное управление транзакциями: в этом случае транзакция управляется с помощью программирования. Он обеспечивает исключительную гибкость, но его очень сложно поддерживать.
Декларативное управление транзакциями: при этом управление транзакциями отделено от бизнес-кода. Для управления транзакциями используются только аннотации или конфигурации на основе XML.
Подробнее
@javatg
👍13🔥1
☕ Учебник по Java: инкапсуляция на простых примерах
Что такое инкапсуляция?
Инкапсуляция описывает идею объединения данных и методов, работающих с этими данными в одном модуле, подобном Java-классу. А еще концепция довольно часто используется для сокрытия внутреннего представления или состояния объекта извне.
Общая идея этого механизма проста. Например, у вас есть атрибут, невидимый снаружи объекта. Вы связываете его с методами, обеспечивающими доступ для чтения или записи, а инкапсуляция позволяет скрыть конкретную информацию и контролировать доступ к внутреннему состоянию объекта.
Если вы знакомы с каким-либо объектно-ориентированным языком программирования, вы, вероятно, знаете эти методы как методы получения и установки – геттеры и сеттеры. Как видно из названий, метод получения получает атрибут, а метод установки изменяет его. В зависимости от того, какой метод вы используете, вы решаете – читать или изменять атрибут. Вы также можете указать, доступен ли атрибут только для чтения или вообще невидим.
➡️ Читать дальше
@javatg
Что такое инкапсуляция?
Инкапсуляция описывает идею объединения данных и методов, работающих с этими данными в одном модуле, подобном Java-классу. А еще концепция довольно часто используется для сокрытия внутреннего представления или состояния объекта извне.
Общая идея этого механизма проста. Например, у вас есть атрибут, невидимый снаружи объекта. Вы связываете его с методами, обеспечивающими доступ для чтения или записи, а инкапсуляция позволяет скрыть конкретную информацию и контролировать доступ к внутреннему состоянию объекта.
Если вы знакомы с каким-либо объектно-ориентированным языком программирования, вы, вероятно, знаете эти методы как методы получения и установки – геттеры и сеттеры. Как видно из названий, метод получения получает атрибут, а метод установки изменяет его. В зависимости от того, какой метод вы используете, вы решаете – читать или изменять атрибут. Вы также можете указать, доступен ли атрибут только для чтения или вообще невидим.
➡️ Читать дальше
@javatg
👍10🔥1
🗿➡️☕ От монолита к микросервисам: как металлурги переходят с Oracle и SQL на Java-стек
https://proglib.io/p/ot-monolita-k-mikroservisam-kak-metallurgi-perehodyat-s-oracle-i-sql-na-java-stek-2022-08-18
https://proglib.io/p/ot-monolita-k-mikroservisam-kak-metallurgi-perehodyat-s-oracle-i-sql-na-java-stek-2022-08-18
Библиотека программиста
🗿➡️☕ От монолита к микросервисам: как металлурги переходят с Oracle и SQL на Java-стек
Поддерживать старый код или шагнуть в продвинутое настоящее? Сложно, но можно, если все рассчитать. История перехода металлургического комбината на современный стек.
💡 Внутренние и вложенные классы java.
Цель статьи: Рассказать о внутренних, вложенных, локальных, анонимных классах. Показать примеры их использования. Написать и протестировать классы в коде на java. Рассказать о свойствах этих классов. Материал предназначен для лучшего понимания безымянных классов, лямбда выражений, адаптеров и многопоточности. То есть перед их изучением.
Небольшое вступление. Предлагаю вашему вниманию цикл из трех статей.
В них я рассказываю о внутренних, вложенных, локальных, анонимных классах. Речь идет о терминологии и применении. Для этих статей я написал довольно много кода.
Это учебный код, а не руководство к действию. То есть сам код я написал для лучшего понимания. Также я постарался объяснить работу учебного кода. На написание данной публикации, ушло довольно много времени. Публикация состоит из трех частей. Прошу отнестись с пониманием.
➡️ Читать дальше
📡 Документация Oracle
@javatg
Цель статьи: Рассказать о внутренних, вложенных, локальных, анонимных классах. Показать примеры их использования. Написать и протестировать классы в коде на java. Рассказать о свойствах этих классов. Материал предназначен для лучшего понимания безымянных классов, лямбда выражений, адаптеров и многопоточности. То есть перед их изучением.
Небольшое вступление. Предлагаю вашему вниманию цикл из трех статей.
В них я рассказываю о внутренних, вложенных, локальных, анонимных классах. Речь идет о терминологии и применении. Для этих статей я написал довольно много кода.
Это учебный код, а не руководство к действию. То есть сам код я написал для лучшего понимания. Также я постарался объяснить работу учебного кода. На написание данной публикации, ушло довольно много времени. Публикация состоит из трех частей. Прошу отнестись с пониманием.
➡️ Читать дальше
📡 Документация Oracle
@javatg
👍10🔥1
Если вы переопределили equals(), то обязательно также переопределить и hashCode(). Это не просто теоретическое требование. Если класс нарушает это правило, хранение его экземпляров в качестве например ключей HashMap приводит к непредсказуемому поведению.
Результат hashCode() должен быть одинаковый для равных в смысле equals объектов. Обычно для этого значение хэш-кода вычисляется на основе значений полей, которые участвуют в equals(). Но и возвращение одной и той же константы 42 для любого экземпляра класса тоже будет валидной реализацией.
Результат hashCode() должен быть равномерно распределен. Это правило не такое строгое как остальные. Его нарушение не сломает программу, хотя может сильно ухудшить производительность. Поэтому константа 42 – допустимая, но не лучшая идея. Вместо этого все значения полей сначала приводятся к int: boolean превращается в любую пару констант, null в 0, для ссылочных типов берется их hashCode(). Затем все эти значения смешиваются с помощью бинарного оператора XOR (^). Дополнительно для лучшего распределения можно применять битовые сдвиги. Если вы владеете информацией о распределении значений полей в конкретно вашем случае, эту реализацию можно улучшить.
Результат hashCode() должен быть одинаковый на протяжении времени жизни объекта. Если вычисление хэш-кода зависит от переменных значений, сохраните его значение во внутреннее поле при первом вызове. При следующих вызовах сразу возвращайте это закэшированное значение.
#Классы
@javatg
Результат hashCode() должен быть одинаковый для равных в смысле equals объектов. Обычно для этого значение хэш-кода вычисляется на основе значений полей, которые участвуют в equals(). Но и возвращение одной и той же константы 42 для любого экземпляра класса тоже будет валидной реализацией.
Результат hashCode() должен быть равномерно распределен. Это правило не такое строгое как остальные. Его нарушение не сломает программу, хотя может сильно ухудшить производительность. Поэтому константа 42 – допустимая, но не лучшая идея. Вместо этого все значения полей сначала приводятся к int: boolean превращается в любую пару констант, null в 0, для ссылочных типов берется их hashCode(). Затем все эти значения смешиваются с помощью бинарного оператора XOR (^). Дополнительно для лучшего распределения можно применять битовые сдвиги. Если вы владеете информацией о распределении значений полей в конкретно вашем случае, эту реализацию можно улучшить.
Результат hashCode() должен быть одинаковый на протяжении времени жизни объекта. Если вычисление хэш-кода зависит от переменных значений, сохраните его значение во внутреннее поле при первом вызове. При следующих вызовах сразу возвращайте это закэшированное значение.
#Классы
@javatg
👍10🔥1
➡️ Java погружаемся в потоки.
Многопоточность в Java была заложена с самых первых дней. Поэтому давайте кратко ознакомимся с тем, про что это — многопоточность.
⚙️ Читать дальше
@javatg
Многопоточность в Java была заложена с самых первых дней. Поэтому давайте кратко ознакомимся с тем, про что это — многопоточность.
⚙️ Читать дальше
@javatg
🔥7
Что такое Reflection и как его использовать?
Reflection, рефлексия – это средства манипуляции данными на основе знания о структуре классов этих данных, инструменты метапрограммирования.
Класс Class<T> используется как точка входа в мир рефлекшена. Его экземпляры предоставляют саму метаинформацию о содержимом класса и основные методы для работы с ним. Все классы относящиеся Java Reflection находятся в пакетах
Экземпляр класса
🔘 Литералом
🔘 Статическим фабричным методом
🔘 Методом getClass() экземпляров класса.
Использование Reflection API медленное и небезопасное. Оно позволяет ломать инвариантность состояний экземпляра, нарушать инкапсуляцию, и даже менять финальные поля.
Использовать рефлексию естественно в тестовом коде, в инструментах разработки, в фреймворках (особенно в связке с runtime-аннотациями). Рефлекшн в ординарном бизнес-коде обычно говорит о больших проблемах проектирования.
Нередко на интервью просят продемонстрировать пример использования рефлекшна. Один из самых близких для backend-разработчика примеров – инициализация классов-конфигураций в Spring Framework. Фреймворк с помощью рефлекшна сканирует внутренности таких классов. Поля и методы, помеченные специальными аннотациями, воспринимаются как объявления элементов экосистемы фреймворка.
#Классы
@javatg
Reflection, рефлексия – это средства манипуляции данными на основе знания о структуре классов этих данных, инструменты метапрограммирования.
Класс Class<T> используется как точка входа в мир рефлекшена. Его экземпляры предоставляют саму метаинформацию о содержимом класса и основные методы для работы с ним. Все классы относящиеся Java Reflection находятся в пакетах
java.lang
и java.lang.reflect
.Экземпляр класса
Class
можно получить тремя способами:🔘 Литералом
.class
;🔘 Статическим фабричным методом
Class.forName()
;🔘 Методом getClass() экземпляров класса.
Использование Reflection API медленное и небезопасное. Оно позволяет ломать инвариантность состояний экземпляра, нарушать инкапсуляцию, и даже менять финальные поля.
Использовать рефлексию естественно в тестовом коде, в инструментах разработки, в фреймворках (особенно в связке с runtime-аннотациями). Рефлекшн в ординарном бизнес-коде обычно говорит о больших проблемах проектирования.
Нередко на интервью просят продемонстрировать пример использования рефлекшна. Один из самых близких для backend-разработчика примеров – инициализация классов-конфигураций в Spring Framework. Фреймворк с помощью рефлекшна сканирует внутренности таких классов. Поля и методы, помеченные специальными аннотациями, воспринимаются как объявления элементов экосистемы фреймворка.
#Классы
@javatg
🔥9👍5
МТС INTRO: стажировки вне шаблонов
Что это значит?
• 10+ направлений стажировки
• Набор 12 месяцев в году
• Погружение в проекты на 3 месяца и дольше, если в команде есть интересные задачи и тебе нравится то, что ты делаешь
• Удобный график
Что мы предлагаем?
• Целая экосистема технологичных цифровых сервисов. Здесь создаются мобильные приложения, продукты в медиа, финтехе, стриминге, гейминге, Big Data и многом другом
• Реальные проекты — лучший источник знаний и опыта
• Команда настоящих профи поможет раскрыться твоим талантам
• Стажёры сами выбирают, сколько часов в неделю работать, а ещё могут менять график в течение стажировки
• Стажировка оплачиваемая, а размер заработной платы зависит от региона и количества рабочих часов
• Оффер в МТС по итогам стажировки: если нам понравится работать вместе, будем рады, если ты станешь членом нашей команды :)
Как подать заявку на стажировку
Выбрать направление стажировки и подать заявку на сайте программы. Новые вакансии появляются каждую неделю.
Что это значит?
• 10+ направлений стажировки
• Набор 12 месяцев в году
• Погружение в проекты на 3 месяца и дольше, если в команде есть интересные задачи и тебе нравится то, что ты делаешь
• Удобный график
Что мы предлагаем?
• Целая экосистема технологичных цифровых сервисов. Здесь создаются мобильные приложения, продукты в медиа, финтехе, стриминге, гейминге, Big Data и многом другом
• Реальные проекты — лучший источник знаний и опыта
• Команда настоящих профи поможет раскрыться твоим талантам
• Стажёры сами выбирают, сколько часов в неделю работать, а ещё могут менять график в течение стажировки
• Стажировка оплачиваемая, а размер заработной платы зависит от региона и количества рабочих часов
• Оффер в МТС по итогам стажировки: если нам понравится работать вместе, будем рады, если ты станешь членом нашей команды :)
Как подать заявку на стажировку
Выбрать направление стажировки и подать заявку на сайте программы. Новые вакансии появляются каждую неделю.
🌶 Java. Lombok: хорошее и плохое применение
Lombok — по-настоящему хороший инструмент, который помогает писать меньше кода и больше сосредотачиваться на реальной работе. Суть в том, как вы используете Lombok в проекте: есть как хорошие, так и плохие способы использования.
Что такое Lombok
Lombok — это библиотека Java, которая сокращает объем стандартного кода в классах. Вы добавляете аннотации, и Lombok генерирует код во время компиляции. Например, если аннотировать класс с помощью @Getter, то Lombok сгенерирует методы-геттеры для всех переменных в классе.
➡️ Читать дальше
@javatg
Lombok — по-настоящему хороший инструмент, который помогает писать меньше кода и больше сосредотачиваться на реальной работе. Суть в том, как вы используете Lombok в проекте: есть как хорошие, так и плохие способы использования.
Что такое Lombok
Lombok — это библиотека Java, которая сокращает объем стандартного кода в классах. Вы добавляете аннотации, и Lombok генерирует код во время компиляции. Например, если аннотировать класс с помощью @Getter, то Lombok сгенерирует методы-геттеры для всех переменных в классе.
➡️ Читать дальше
@javatg
👍14❤1🔥1