№ 4931127152 Изучаем Java. По вопросам сотрудничества: @adv_and_pr Канал на бирже: https://telega.in/c/seniorjavist
#вопросы_с_собеседований
Дайте определение понятию «конструктор»
Конструктор — это специальный метод, у которого отсутствует возвращаемый тип и который имеет то же имя, что и класс, в котором он используется. Конструктор вызывается при создании нового объекта класса и определяет действия необходимые для его инициализации.
Какие планы на 30 августа? Есть возможность попасть на JVM Day — профильную конференцию для разработчиков.
В планах:
— обсудить кейсы, нестандартные решения и инженерные практики;
— послушать доклады специалистов из Сбера, Т-Банка, Яндекса, 2ГИС, Squad, 01. tech;
— проводить сезон на афтепати в компании единомышленников.
Часть вырученных на мероприятии средств пойдет на поддержку региональных вузов.
Встреча пройдет в штаб-квартире Т-Банка, а узнать подробности и купить билеты можно тут.
Сжатие указателей в Java
В статье речь пойдет о реализации сжатия указателей в Java Virtual Machine 64-bit, которое контролируется опцией UseCompressedOops и включено по-умолчанию для 64 битных систем начиная с Java SE 6u23.
Смотреть статью
🎉 Большой розыгрыш от крупнейшего IT-медиа 1337, легендарного паблика Рифмы и Панчи, канала Техно.
Победителей будет много, а для участия нужны лишь пара кликов:
1. Подписаться на Рифмы и Панчи, 1337 и на Техно.
2. Нажать «Участвовать» под этим постом
Что по призам:
1 место - Iphone 16 Pro
2 место - PS5 Slim
3 место - Nintendo Switch 2
4-10 места - 10 000 рублей на карту
#вопросы_с_собеседований
Swing: рассказать про EDT, как им пользоваться
EDT — тред в котором производится обработка пользовательских действий на UI: движение курсора, нажатие клавиш, скролл, drag'n'drop и.т.д. Соотвественно, все «тяжелые» по времени и ресурсам операции нужно выносить в отдельный worker-тред (SwingUtils.invokeLater(...)), чтобы не фризить EDT.
#вопросы_с_собеседований
Generics: В чем преимущество, как работают? Что такое type-erasure? В чем отличие от шаблонов C++?
🔸Типы дженерики обеспечивают параметрический полиморфизм, т.е выполнение идентичного кода для различных типов. Типичный пример — коллекции, итераторы
🔸type-erasure — это стирание информации о типе-параметре в runtime. Таким образом, в байт-коде мы увидим List, Set вместо List<Integer>, Set<Integer>, ну и type-cast'ы при необходимости
🔸В отличие от дженериков в Java, в С++ шаблоны в итоге приводят к компиляции метода или типа для каждого специфицированного типа параметра (специализация шаблона). Да простят меня здесь адепты С++.
Countdown Latch/Cyclic Barrier
CountdownLatch («защелка») — примитив синхронизации, с помощью которого, например, основной thread может ожидать выполнения работы остальных N тредов. Треды, выполняющие работу, выполняют countDown() на защелке, основной тред ожидает на операции await(). Когда счетчик достигает нуля, основной тред продолжает работу.
Для синхронизации N тредов (все ждут всех) и переиспользования используется CyclicBarrier, ему также можно указывать действие (через Runnable), выполняемое после синхронизации всех-со-всеми
#вопросы_с_собеседований
В чем разница между execute, executeQuery, executeUpdate?
🔸Выполнение инструкции(строковый запрос) используется для выполнения любого SQL-запроса и возвращает TRUE, если результатом является ResultSet, такой как выполнение запросов Select. Выходные данные – ЛОЖЬ, если нет объекта ResultSet, такого как выполняющиеся запросы Insert или Update. Мы можем использовать getResultSet(), чтобы получить ResultSet, и метод getUpdateCount(), чтобы получить счетчик обновлений.
🔸Оператор executeQuery(строковый запрос) используется для выполнения запросов Select и возвращает ResultSet. Возвращаемый ResultSet никогда не является нулевым, даже если нет записей, соответствующих запросу. При выполнении запросов select мы должны использовать метод executeQuery, чтобы, если кто-то попытается выполнить оператор вставки / обновления, он выбросит java.sql.SQLException с сообщением «Метод executeQuery не может использоваться для обновления».
🔸Оператор executeUpdate (строковый запрос ) используется для выполнения операторов Insert / Update / Delete (DML) или операторов DDL, которые ничего не возвращают. Результат – int и равен количеству строк для операторов языка манипулирования данными SQL (DML). Для операторов DDL на выходе будет 0.
#вопросы_с_собеседований
Как файлы cookie работают в сервлетах?
🔸Файлы cookie – это текстовые данные, отправляемые сервером клиенту и сохраняемые на локальном компьютере клиента.
🔸Servlet API обеспечивает поддержку файлов cookie через класс javax.servlet.http.Cookie, который реализует интерфейсы Serializable и Cloneable.
🔸Метод HttpServletRequest getCookies() предоставляется для получения массива файлов cookie из запроса, поскольку нет смысла добавлять файлы cookie в запрос, нет методов для установки или добавления файлов cookie в запрос.
🔸Аналогичным образом предоставляется метод HttpServletResponse addCookie(Cookie c) для прикрепления файла cookie в заголовке ответа, методы получения для cookie отсутствуют.
#вопросы_с_собеседований
Что такое Instance Variable?
Instance Variable — переменная, которая определена внутри класса, и она существует вплоть до того момента, пока существует объект.
Пример — класс Bee, в котором есть две переменные nectarCapacity и maxNectarCapacity
CastingCasting
используется для преобразования переменной одного типа данных в другой. Существуют два типа преобразования: расширяющее (Widening Casting) и сужающее
(Narrowing Casting).
Расширяющее преобразование (Widening Casting): Процесс преобразования данных меньшего типа в больший тип называется расширяющим преобразованием. Это преобразование выполняется автоматически. (изображение 1)
Сужающее преобразование (Narrowing Casting): Преобразование данных большего типа в меньший тип называется сужающим преобразованием. Это преобразование должно выполняться вручную. (изображение 2)
⚖️ 👩💻 LangChain в Java: Langchain4j, Quarkus, Spring Boot
LangChain открывает мощные возможности LLM в приложениях Java, упрощая интеграцию ИИ в сервисы на Quarkus и Spring Boot.
🗓 17 июня в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Advanced».
📌О чём поговорим:
- Framework LangChain: ключевые концепции и архитектура.
- Langchain4j: возможности Java-библиотеки.
- Интеграция Langchain4j в проекты на Spring Boot и Quarkus.
- Spring AI: фреймворк для работы с LLM в Spring.
📌Кому будет интересно:
Java-разработчикам, архитекторам ПО и инженерам ML Ops, планирующим внедрять LLM в микросервисы на Quarkus или Spring Boot.
📌В результате урока вы:
Познакомитесь с Langchain4j и сможете написать простой Java-сервис, использующий LLM.
🔗 Ссылка на регистрацию: https://otus.pw/ZLUG/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
#вопросы_с_собеседований
В чем заключается отличие класса Thread от интерфейса Runnable?Thread
— это абстракция над физическим потоком. Runnable
— это абстракция над выполняемой задачей. Основное различие между ними состоит в том, что каждый поток, определенный расширением класса Thread
, создает уникальный объект и связывается с этим объектом.
Преимущество использования Runnable
заключается в том, что он позволяет логически отделить выполнение задачи от логики управления потоками. Кроме того, поскольку Runnable
является интерфейсом, вы можете наследовать другой класс и реализовывать интерфейс Runnable
в одном и том же классе. Это дает большую гибкость при проектировании приложений.
string-poolString Pool
— это область хранения в куче Java. Выделение строки, как и выделение любого объекта, является дорогостоящим мероприятием как в случае времени, так и памяти. JVM выполняет некоторые шаги при инициализации строковых литералов для повышения производительности и уменьшения нагрузки на память.
В этом примере constantString1
и constantString2
ссылаются на один и тот же объект в String Pool
, потому что они имеют одинаковое значение, поэтому результат работы программы будет true
.
15 июля в 20:00 МСК OTUS проведёт открытый урок «Нормальная денормализация» — ключевой приём для оптимизации доступа к данным в NoSQL.
На примере Spring Data MongoDB разберём, как настраивать связи между сущностями: когда выбрать вложенные документы, а когда — ссылочные связи. Вы поймёте, как денормализация влияет на производительность запросов, расходы на память и сложность поддержки.
Урок будет полезен Java-разработчикам, backend-инженерам и архитекторам, работающим с MongoDB. Вы получите готовые шаблоны организации данных в Spring-приложениях, избежите типичных ошибок при проектировании схемы и сможете принимать обоснованные архитектурные решения.
Присоединяйтесь к уроку и получите скидку на полный курс «Разработчик на Spring Framework».
Регистрируйтесь прямо сейчас: https://otus.pw/QPOb/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Enum vs String
Используйте Enum для предопределенных состояний модели там, где это возможно. Это не только упрощает понимание кода, но и ускоряет процесс сравнения этих состояний. Сравнение по ссылке, определенно, на порядок быстрее стравнения строк или других обьектов.
Правда, в этом случае есть один большой минус — стоимость поддержки приложения увеличивается, особенно это становится заметным, когда нужно добавить, удалить или изменить одно из существующих состояний.
Но в случае если это неизменные свойства, как месяц года, то смело используйте перечисление.
#вопросы_с_собеседований
В чем разница между композицией и агрегацией?
Ассоциация обозначает связь между объектами. Композиция и агрегация — частные случаи ассоциации «часть-целое».
Агрегация предполагает, что объекты связаны взаимоотношением «part-of» (часть). Композиция более строгий вариант агрегации. Дополнительно к требованию «part-of» накладывается условие, что экземпляр «части» может входить только в одно целое (или никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в несколько целых.
Например, книга состоит из страниц, и мы не можем вырвать страницу из книги и вложить в другую книгу. Страницы четко привязаны к конкретной книге, поэтому это композиция. В тоже время мы можем взять и перенести книгу из одной библиотеки в другую - это уже агрегация.
#вопросы_с_собеседований
Что такое string-pool? В чем отличие cоздания строки через new от литерала? Что такое String.intern()?
string-pool — структура в памяти, хранящая массив всех строк-литералов программы.
String.intern(), соответственно, вернет строку из пула, при наличии таковой. Полезно при сравнениях вида:
new String("hello").intern() == new String("hello").intern()
Т.к. без интернирования пришлось бы сравнивать строки через equals, что может быть медленнее при наличии длинных строк. В данном случае возвращается ссылка на один и тот же объект строки из пула, и проверка проходит с true.
#вопросы_с_собеседований
Как в Java сделать утечку памяти?
Используя самописный класс стека, при выполнении операции pop() не присваивать предыдущей ссылке значение null.
Также можно неверно использовать HashMap вместо WeakHashMap для кэширования чего-нибудь большого, например картинок ваших товаров, пользователей и т.д в. Т.к ссылки на ключи сильные (strong references), значения по этим ключам будут висеть в хипе до следующей перезагрузки jvm процесса или удаления ключа из мапы и обнуления ссылки на него.
👩💻 Ваши Java-приложения под нагрузкой едва дышат? Профилирование и оптимизация кода остаются за скобками?
Курс «Java Developer. Advanced» от OTUS — это глубокое погружение в устройство JVM, байткод, сборщики мусора, профилирование и оптимизацию в облаке.
Наши эксперты-практики покажут, как выбрать GC, снять дамп памяти и обнаружить утечки, как профилировать “горячие” места, настраивать интеграцию с Prometheus & Grafana и деплоить сервисы в Kubernetes.
🦾 Вы научитесь обосновывать выбор JVM-имплементации, анализировать heap-дампы, синхронизировать потоки, использовать Reactor и неблокирующие I/O, проектировать метрики и трассировку.
➡️ Пройдите короткий тест и присоединяйтесь к группе: https://otus.pw/jvfb/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
📢 Выходцы из Jetbrains запилили годноту для Java/Kotlin-разработчиков.
Стартап называется ❇️ Explyt.
Они только что выкатили мощный релиз.
Вкратце: это плагин в IDE, который сам генерирует тесты с интересными возможностями:
✔️ Vibe debugging. За счет интеграции с IDE, плагин собирает данные по исполнению программы и генерирует тест по этим данным, что экономит время на тестировании и отлавливает ошибки на 80-90% (!)
✔️ Агентский режим. Ассистент, который живёт в проекте и следит за покрытием, сам находит незакрытые места и предлагает тесты. Работает в фоне, как часть команды.
👉 Кому интересно - вот ссылка на релиз и установку плагина
#вопросы_с_собеседований
ThreadPoolExecutor — описать механизм работы, св-ва, частности (fixed threadpool, scheduled, single thread executor)
ThreadPoolExecutor — средство контроля исполнения параллельных задач, задействует один из свободных тредов в общем пуле, или ставит задание в очередь, если таковых нет, или достигнуты определенные условия (ниже)
Основными св-вами ThreadPoolExecutor являются corePoolSize и maxPoolSize. Если текущее количество тредов в пуле < corePoolSize — новый тред будет создаваться в независимости от того, есть ли в пуле незанятые треды. В промежутке между corePoolSize и maxPoolSize тред будет создаваться в том случае, если заполнена очередь задач, и удаляться спустя keepAliveTime. Если кол-во тредов стало >= maxPoolSize — новые треды не создаются, а задачи ставятся в очередь.
Есть возможность регулировать поведение очереди:
🔸Direct handoffs: немедленная передача задачи тредпулу. Нет понятия очереди задачи. Если свободных тредов нет — кидается exception. Применимо при неограниченных maxPoolSize, но нужно понимать проблему при быстрых записях и медленных чтениях, что может спровоцировать непомерное потребление ресурсов
🔸Unbounded queues: очередь без ограничений. Задачи будут добавляться в нее при превышении corePoolSize, при этом maxPoolSize будет игнорироваться. Unbounded queues имеют проблемы потребления ресурсов при больших нагрузках, но сглаживают рост тредов при пиках.
🔸Bounded queues: очередь с ограничениями. Задачи будут добавляться в очередь до достижения некоего capacity. Для достижения наилучшей производительности нужно понимать размеры corePoolSize и самой очереди и чем можно пожертвовать — перфомансом (малый corePoolSize и большая очередь), или же памятью (ограниченная очередь, большой corePoolSize)
Частности ThreadPoolExecutor:
ScheduleThreadPoolExecutor — применяется для периодичных по времени задач
fixed thread pool — частность ScheduleThreadPoolExecutor'а с настроенным corePoolSize и unbounded queue
single thread executor — тредпулл, c сorePoolSize = 1, гарантирующий последовательное выполнение задач из очереди
👩💻Открытый урок «Как победить кодировки и стать Гуру Unicode?».
🗓 17 июля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java-разработчик».
Ошибки в кодировках ломают приложения, превращая текст в «абракадабру». Понимание таблиц кодировок — must-have навык для работы с данными, файлами и международными проектами.
О чём поговорим:
✔️ ASCII, UTF-8, Unicode — WTF? Разберём, как Java хранит и обрабатывает текст.
✔️ Почему файлы «ломаются»? Как избежать ошибок при чтении/записи данных.
✔️ Лайфхаки для юникода: работа с иероглифами и русским языком.
✔️ Секреты JVM: как настроить кодировку в проекте.
Кому будет интересно:
Начинающим Java-разработчикам и тестировщикам, сталкивающимся с международными данными и проблемами кодировки.
🔗 Ссылка на регистрацию: https://otus.pw/v8np/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
#вопросы_с_собеседований
Что такое Local Variable?
Популярный вопрос на собеседовании Java-разработчика. Local variable — это переменная, которая определена внутри метода и существует вплоть до того момента, пока выполняется этот метод. Как только выполнение закончится, локальная переменная перестанет существовать.
Вот программа, которая использует локальную переменную helloMessage в методе main()
#вопросы_с_собеседований
Что такое Static import?
Статический импорт позволяет использовать статические члены (поля и методы), которые были определены в классе как public static
, без указания класса, в котором было определено поле. Это удобно, когда вам нужно использовать статические члены класса многократно. Статический импорт также помогает избежать создания константного интерфейса, что считается неправильным использованием интерфейсов.
Константный интерфейс — это интерфейс, который определяет только константы, а затем класс реализует этот интерфейс для доступа к константам.
*Однако, если два статических члена с одинаковым именем импортируются из разных классов, компилятор выдаст ошибку, так как он не сможет определить, какой член использовать.
#вопросы_с_собеседований
Что такое Run-Time Data Areas?Run-Time Data Areas
— это области памяти, используемые Java Virtual Machine во время выполнения программы. Они отвечают за предоставление памяти для хранения байт-кода, объектов, параметров, локальных переменных, возвращаемых значений и промежуточных результатов вычислений. Некоторые из этих областей данных создаются при запуске Java Virtual Machine и уничтожаются только при выходе из Java Virtual Machine.
Например, существуют такие области данных как:
1. Class Area
- область хранения для структуры элементов класса, таких как поля, данные методов, код метода и т. д.
2. Heap
- выделение памяти во время выполнения для объектов.
3. Stack
- хранение для локальных переменных и частичных результатов. Стек содержит кадры и выделяет по одному для каждого потока.
4. PC Registers
- регистры счетчика программ содержат адрес инструкции, которую JVM в настоящее время выполняет.
Runnable
Интерфейс Runnable
предоставляет стандартный набор правил для экземпляров классов, которые хотят выполнять код, когда они активны. Этот интерфейс должен быть реализован любым классом, экземпляры которого предназначены для выполнения потоком. Класс должен определить метод без аргументов с именем run
.
В этом примере создается новый поток t1
, который запускает экземпляр класса RunnableImpl
, реализующий интерфейс Runnable
. Метод run
этого класса выводит сообщение с именем текущего потока и текстом “выполняется метод run()!”.
Вывод показывает два активных потока в программе - main
и Thread-0
. Метод main
выполняется главным потоком, а вызов метода start
на RunnableImpl
создает и запускает новый поток — Thread-0
.
Нейронка VEO 3 от Google теперь в Telegram!
Нейросеть для создания видео теперь доступна напрямую. Можно генерировать видео по запросу и даже оживлять фотографии.
Ссылка: @veo3
#вопросы_с_собеседований
Какая разница между Statement и PreparedStatement?Statement
и PreparedStatement
- это два интерфейса в JDBC, которые используются для выполнения SQL-запросов. Они имеют несколько отличий:-
Statement
используется для выполнения статических SQL-запросов без параметров.-
PreparedStatement
используется для выполнения динамических SQL-запросов с параметрами. Этот интерфейс принимает входные параметры во время выполнения и может быть использован многократно.-
PreparedStatement
прекомпилирован, поэтому его исполнение может происходить быстрее, чем у Statement
.-
PreparedStatement
также обеспечивает дополнительную безопасность, предотвращая атаки типа SQL-инъекции.
В общем, если в запрос нужно передавать параметры или он должен выполняться несколько раз, используйте PreparedStatement
. В противном случае используйте Statement
.
Получаем порядковый номер элемента в enum
Метод ordinal()
используется с перечислениями (enum
). Он возвращает порядковый номер константы перечисления, начиная с нуля.
В этом примере создается перечисление Colours
с четырьмя константами: Red
, Green
, Brown
и Yellow
. В методе main
создаются переменные для каждой из этих констант и выводятся их порядковые номера с помощью метода ordinal()
.