#вопросы_с_собеседований
Что такое абстрактный метод в языке Java?
Абстрактный метод – это метод без тела. Вы просто объявляете метод, не определяя его, с использованием ключевого слова abstract в объявлении метода. Все объявленные внутри интерфейса в языке Java методы – по умолчанию абстрактные. Пример абстрактного метода в языке Java представлен на картинке.
Теперь, для реализации этого метода необходимо расширить абстрактный класс и этот метод переопределить.
#вопросы_с_собеседований
Можно ли указывать конструктор внутри Enum?
Да, конечно. Именно через конструктор и задаются значения внутренних переменных enum.
В качестве примера добавим два поля — ageFrom и ageTo — чтобы обозначить возрастные рамки для каждой роли.
☕️🧵 Введение в многопоточность в Java. Часть 1. Преимущества и недостатки многопоточности
В чем заключается «магия» многопоточности? Как создать поток и чем он отличается от процесса? Как процессор обрабатывает потоки?
https://proglib.io/sh/rTu4Hg3OE7
Зачем нужны профили в Spring?
При разработке приложений мы обычно имеем дело с несколькими средами, такими как Dev, QA и Prod. Свойства конфигурации для этих сред отличаются.
Например, мы можем использовать встроенную базу данных H2 для Dev, но Prod может использовать проприетарную базу данных Oracle или DB2. Даже если СУБД одинакова во всех средах, URL-адреса определенно будут разными.
Чтобы сделать это простым и понятным, Spring предоставляет профили, помогающие разделить конфигурацию для каждой среды.Таким образом, вместо того, чтобы поддерживать это программно, свойства можно хранить в отдельных файлах, таких как application-dev.properties и application-prod.properties. По умолчанию application.properties указывает на текущий активный профиль с помощью spring.profiles.active, чтобы подобрать правильную конфигурацию.
Больше узнать о профилях в Spring можно по ссылке: https://www.baeldung.com/spring-profiles
Interface for Consts
Очень часто встречаются интерфейсы для описания констант. Это не правильно с точки зрения ООП. Интерфейс должен описывать поведение, не больше не меньше. Этот пункт не очень принципиален, тем более что результат компиляции будет один и тот же, но все же java это ООП язык и было бы хорошо придерживаться его принципов.
Форматирование строк
Класс String предоставляет возможность создания форматированных строк. За это отвечает статический метод format.
#вопросы_с_собеседований
Что такое переопределение (overriding) методов?
Переопределение методов происходит, когда child хочет изменить поведение parent класса. Если нужно, чтоб выполнилось-таки то, что есть в методе parent, можно использовать в child конструкцию вида super.methodName(), что выполнит работу parent метода, а уже потом добавить логику.
Требования, которые нужно соблюдать:
☕️ сигнатура метода должна быть такая же;
☕️ возвращаемое значение должно быть таким же.
Senior Java Разработчик отвечает на вопросы о работе
Таймкоды:
00:00 - Вступление
00:26 - Почему ты выбрал Java?
00:48 - Как понять, что ты уже Senior Developer?
01:03 - Сколько времени ушло на путь от Junior до Senior?
01:26 - Какой уровень английского требуется Senior разработчику?
01:37 - Для Senior разработчика борода обязательный атрибут или можно работать без неё?
01:52 - Как проходит твой рабочий день? Какие твои обязанности?
Сколько времени уходит на написание кода, сколько на коммуникации и сколько на диаграммы/архитектуру?
03:08 - Где грань между Senior и Lead?
03:21 - Сколько зарабатывают Java Senior разработчики? ЗП от 2к долларов миф или реальность?
04:14 - Какие языки/инструменты, кроме Java, используешь на постоянной основе?
04:59 - Ты все еще чувствуешь синдром самозванца?
05:06 - Страдают ли сеньоры манией величия?
05:27 - Есть ли жизнь после Senior? Какие есть возможности для карьерного роста в будущем?
06:29 - На каком проекте ты мечтал бы поработать?
07:04 - Еще пишешь *овнокод?
07:26 - Если бы не программирование, чем бы занимался?
07:37 - Что посоветуешь начинающим Java разработчикам?
08:09 - Что бесит в работе?
09:11 - Что радует в программировании?
Смотреть видео
Какую архитектуру выбрать для приложения?
🗓 22 февраля в 17:00 пройдет открытый урок «Микросервисная архитектура, когда нужна, а когда нет» в OTUS c преподавателем Станиславом Щетинниковым, директором разработки с 10-летним опытом.
На занятии мы:
- рассмотрим плюсы и минусы монолитов и микросервисов,
- разберем проблемы при двух подходах,
- узнаем основные паттерны в микросервисной архитектуре.
👉 Для регистрации на занятие пройдите вступительный тест — https://otus.pw/5jYs/
Занятие пройдет в рамках онлайн-курса «Microservice Architecture», это ваш шанс познакомиться с экспертом и протестировать курс!
#вопросы_с_собеседований
Какое начальное количество корзин в HashMap?
В конструкторе по умолчанию - 16, используя конструкторы с параметрами можно задавать произвольное начальное количество корзин.
Скачиваем видео с Youtube
VGet позволит вам скопировать видео с YouTube, используя только URL-адрес.
Как видите, первая строка кода в блоке try просто указывает URL-адрес YouTube.
В следующей строке указывается путь, по которому вы хотите сохранить загруженный файл.
Далее код создает экземпляр VGet. Это рабочий класс, который будет обрабатывать процесс загрузки.
Наконец, код вызывает download() метод VGet объекта.
Подробнее ознакомиться можно здесь.
#вопросы_с_собеседований
Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode()?
Общий совет: выбирать поля, которые с большой долью вероятности будут различаться. Для этого необходимо использовать уникальные, лучше всего примитивные поля, например, такие как id, uuid. При этом нужно следовать правилу, если поля задействованы при вычислении hashCode(), то они должны быть задействованы и при выполнении equals().
Какие интересные возможности Java выделяют разработчики
Здесь собраны некоторые возможности, которые вызвали наибольший интерес.
☕️ Pattern Matching — оператор instanceof с паттерн-матчингом теперь стал стабильной синтаксической конструкцией и больше не требует флага --enable-preview.
☕️ Stream.toList() — метод собирает содержимое Stream в неизменяемый список и возвращает его.
☕️ Stream.mapMulti() — императивный аналог Stream.flatMap(), принимающий процедуру с двумя параметрами, где первый параметр – текущий элемент, а второй – Consumer, в который кладутся значения.
☕️ Records — записи обеспечивают компактный синтаксис для объявления классов, позволяющий в некоторых случаях обойтись без явного определения низкоуровневых методов вроде equals(), hashCode() и toString().
JEP-400 или UTF-8 РєРѕРґРёСЂРѕРІРєР° РїРѕ умолчанию
Не прошло и пяти лет, как в Java 18 докатилось небольшое, но очень ожидаемое и обсуждаемое изменение. Теперь во всех стандартных API используется UTF-8 кодировка по умолчанию. Это изменение, которое сделает выражение «Write once, run anywhere» действительно правдой, так как теперь поведение приложения будет еще меньше зависеть от системы, где оно запущено.
Смотреть статью
#вопросы_с_собеседований
Что выведет код сверху?
Ответ:
Программа не выдаст ошибки компиляции. Поскольку a больше 20, а b больше 25, будет выведена 1. Второй оператор if не будет истинным, так как a не больше 30, поэтому будет выполнен блок else, который выведет 3. Таким образом, на выходе будет 1, а затем 3. Обратите пристальное внимание на операторы if и else if. Если бы вместо второго оператора if был оператор else if, то на выходе была бы только 1.
Какие основные аннотации предлагает Spring Boot?
Основные аннотации, которые предлагает Spring Boot, находятся в его org.springframework.boot.autoconfigure
и подпакетах.
Вот пара основных:
☕️ @EnableAutoConfiguration
— заставить Spring Boot искать bean-компоненты автоконфигурации и автоматически применять их;
☕️ @SpringBootApplication
— для обозначения основного класса загрузочного приложения. Эта аннотация объединяет
аннотации @Configuration
, @EnableAutoConfiguration
и @ComponentScan
с атрибутами по умолчанию.
Более глубокое погружение в аннотации: https://www.baeldung.com/spring-boot-annotations
Время выполнения программы
Используя system.currentTimeMillis()
, мы можем довольно просто узнать приблизительное время выполнения программы. Для этого сохраним начало отсчета и затем вычтем его из финиша.
#вопросы_с_собеседований
Как написать immutable класс?
Чтоб написать immutable неизменяемый класс, нужно следовать простым пунктам:
☕️ сделать класс финальным.
☕️ сделать все поля приватными и создать только геттеры к ним. Сеттеры, разумеется, не нужно.
☕️ Сделать все mutable поля final, чтобы установить значение можно было только один раз.
☕️ инициализировать все поля через конструктор, выполняя глубокое копирование (то есть, копируя и сам объект, и его переменные, и переменные переменных, и так далее)
☕️ клонировать объекты mutable переменных в геттерах, чтобы возвращать только копии значений, а не ссылки на актуальные объекты.
Быстрое умножение или деление на 2
Умножение на 2 означает сдвиг всех битов влево, а деление на 2 означает сдвиг вправо.
Например:
2 (Двоичный 10): сдвиг влево(умножение) дает 4 (Двоичный 100) и вправо(деление) дает 1 (Двоичный 1).
#вопросы_с_собеседований
Для чего нужен метод hashCode()?
Метод hashCode() необходим для вычисления хэш кода переданного в качестве входного параметра объекта. В Java это целое число, в более широком смысле - битовая строка фиксированной длины, полученная из массива произвольной длины. Этот метод реализован таким образом, что для одного и того же входного объекта, хэш код всегда будет одинаковым. Следует понимать, что в Java множество возможных хэш кодов ограничено типом int, а множество объектов ничем не ограничено. Из-за этого, вполне возможна ситуация, что хэш коды разных объектов могут совпасть:
• если хэш коды разные, то и объекты гарантированно разные;
• если хэш коды равны, то объекты не обязательно равны(могут быть разные).
#вопросы_с_собеседований
Чем отличаются конструктор по-умолчанию, конструктор копирования и конструктор с параметрами?
У конструктора по умолчанию отсутствуют какие-либо аргументы. Конструктор копирования принимает в качестве аргумента уже существующий объект класса для последующего создания его клона. Конструктор с параметрами имеет в своей сигнатуре аргументы (обычно необходимые для инициализации полей класса).
Техника «10 тестов в день» – одна из самых эффективных в изучении Java.
Канал Java Guru выложил в открытый доступ тесты, которые дают на собеседованиях в топовые компании, вроде Яндекс и MailRu.
➤ Открываете задачку – выбираете вариант – видите правильный ответ и детальное объяснение к нему. Так вы усвоите на 50% больше знаний в сжатые сроки.
Подписывайтесь и качайте свои скиллы: @javatasks
Как в Java устроено выделение регистров в памяти
Когда виртуальная машина Java компилирует ваш исходный код Java в машинный, одна из задач, которые она должна при этом выполнить – решить, где хранить локальные переменные Java и другие подобные временные значения. В вашей машине отсутствует концепция локальных переменных, поэтому на этапе компиляции необходимо определиться, какое место в памяти стека (какой машинный регистр) будет использоваться для хранения каждой переменной. Эта операция называется «выделение регистров». Может показаться, что выделение регистров – сложная абстрактная теоретическая тема, но в этом коротком посте я покажу, как сначала соотнести исходный код Java с теорией, потом понять, как его видит компилятор, а потом – показать результирующий машинный код. В данном случае моя цель – продемонстрировать, что все эти концепции очень легко опробовать на практике с реальным компилятором.
Читать статью
Как изменить аргументы командной строки Java
Аргументы командной строки Java позволяют передавать аргументы во время выполнения программы непосредственно из консоли, к которой будет обращаться метод main(). А также позволяет использовать их в качестве входных данных или обходить аргументы командной строки, передав значения непосредственно методу main().
Смотреть статью
Метод trim()
Возвращает копию данной строки, в которой удаляются начальные и конечные пробелы, или данную строку, если она не имеет начальных или конечных пробелов.
#вопросы_с_собеседований
Почему char[] предпочтительнее String для хранения пароля?
С момента создания строка остаётся в пуле, до тех пор, пока не будет удалена сборщиком мусора. Поэтому, даже после окончания использования пароля, он некоторое время продолжает оставаться доступным в памяти и способа избежать этого не существует. Это представляет определённый риск для безопасности, поскольку кто-либо, имеющий доступ к памяти сможет найти пароль в виде текста. В случае использования массива символов для хранения пароля имеется возможность очистить его сразу по окончанию работы с паролем, позволяя избежать риска безопасности, свойственного строке.