Java | Вопросы собесов
11.4K subscribers
31 photos
2 videos
1.2K links
Download Telegram
Что такое ООП ?
Спросят с вероятностью 81%

Объектно-ориентированное программирование (ООП) — это парадигма, основанная на концепции "объектов", которые могут содержать данные в виде полей (часто называемых атрибутами или свойствами) и код в виде процедур (часто называемых методами). ООП фокусируется на использовании объектов для моделирования реальных или абстрактных сущностей, интересующих в процессе разработки программного обеспечения, облегчая тем самым разработку и поддержку программ.

Основные принципы:

1️⃣ Инкапсуляция — это сокрытие внутренних деталей реализации объекта от внешнего мира. Только сам объект управляет своим состоянием, внешние объекты взаимодействуют с ним через методы. Это позволяет упростить интерфейсы взаимодействия между компонентами и улучшить модульность.

2️⃣ Наследование — механизм, с помощью которого один класс (дочерний класс) может наследовать свойства и методы другого класса (родительского класса), потенциально переопределяя некоторые из них. Это способствует повторному использованию кода и иерархической организации классов.

3️⃣ Полиморфизм — способность объектов с одинаковым интерфейсом предоставлять различную реализацию. Это позволяет одному и тому же коду работать с объектами разных типов.

4️⃣ Абстракция — процесс выделения существенных характеристик объекта, исключая несущественные. Это помогает сосредоточиться на том, что объект делает, а не на том, как он это делает.

Пример:
class Животное {
void есть() {
System.out.println("Животное ест");
}
}

class Кот extends Животное {
void есть() {
System.out.println("Кот ест рыбу");
}
}

public class Main {
public static void main(String[] args) {
Животное моеЖивотное = new Кот();
моеЖивотное.есть(); // Выведет "Кот ест рыбу", демонстрируя полиморфизм
}
}


В этом примере Кот наследует поведение от Животное и переопределяет метод есть, демонстрируя наследование и полиморфизм. Инкапсуляция и абстракция также затрагиваются, поскольку мы взаимодействуем с объектами через их поведение, не заботясь о внутреннем устройстве.

Объектно-ориентированное программирование — это подход к разработке программ, который использует "объекты" — сущности с данными и методами для моделирования реального или абстрактного мира. Это помогает сделать код более модульным, легко расширяемым и поддерживаемым.

Примеры ответов
Список всех вопросов на Java Developer

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🎉8🔥71😁1
В чем разница между checked и unchecked исключениями ?
Спросят с вероятностью 75%

Исключения (exceptions) важная часть обработки ошибок. Есть две основные категории: проверяемые (checked) и непроверяемые (unchecked).

Проверяемые исключения (Checked Exceptions):
Должны быть явно обработаны в коде с помощью блока try-catch или должны быть указаны в сигнатуре метода с помощью ключевого слова throws.
Они представляют ошибки, которые могут возникнуть во время выполнения программы и которые во многих случаях программист может предвидеть и обработать. Например, ошибка чтения файла, когда файл не существует.
Примеры классов проверяемых исключений включают IOException, FileNotFoundException, ClassNotFoundException и другие.

Пример:
try {
FileInputStream file = new FileInputStream("non_existent_file.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}


В этом примере FileNotFoundException является проверяемым исключением, и его необходимо обрабатывать в блоке try-catch.

Непроверяемые исключения (Unchecked Exceptions):
Не требуют обязательной обработки в коде. Они обычно возникают из-за ошибок программирования, таких как деление на ноль или доступ к элементу за пределами массива.
К ним относятся ошибки времени выполнения (RuntimeException) и ошибки (Error).
Примеры включают NullPointerException, IndexOutOfBoundsException, ArithmeticException и другие.

Пример:
int result = 10 / 0; // Приводит к ArithmeticException


Здесь ArithmeticException является непроверяемым исключением, вызванным делением на ноль.

Почему разделение на checked и unchecked?
Разделение позволяет управлять потенциальными ошибками, которые могут быть исправлены, и отличать их от ошибок времени выполнения, которые чаще всего являются результатом ошибок в коде. Это способствует написанию более надежного и устойчивого к ошибкам кода.

Примеры ответов
Список всех вопросов на Java Developer

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥4
Какие методы в классе Object есть ?
Спросят с вероятностью 69%

Object - суперкласс для всех классов. Все объекты, включая массивы, наследуют методы этого класса. Они предоставляют функции, которые доступны для любого объекта. Вот основные методы:

1️⃣ clone() - создает и возвращает копию объекта. Метод защищенный, поэтому его можно вызвать только внутри класса объекта или в классах потомках.

2️⃣ equals(Object obj) - определяет равенство между двумя объектами. По умолчанию, этот метод сравнивает ссылки на объекты.

3️⃣ finalize() - вызывается перед удалением объекта сборщиком мусора. Метод устарел.

4️⃣ getClass() - возвращает Class, который представляет класс данного объекта. Можно использовать для получения имени во время выполнения.

5️⃣ hashCode() - возвращает хеш-код, который используется для оптимизации хранения в структурах данных.

6️⃣ notify() - пробуждает один поток, который ожидает на объекте (вызвавший wait()). Этот метод должен вызываться в синхронизированном контексте.

7️⃣ notifyAll() - пробуждает все ожидающие потоки. Должен вызываться в синхронизированном контексте.

8️⃣ toString() - возвращает строковое представление. По умолчанию, возвращает класс и хеш-код, но часто переопределяется для предоставления более информативного представления.

9️⃣ wait() - заставляет текущий поток ожидать, пока другой поток не вызовет notify() или notifyAll(). Существуют перегруженные версии wait(long timeout) и wait(long timeout, int nanos), позволяющие указать максимальное время ожидания.

Эти методы предоставляют основу для механизмов, таких как сравнение объектов, их клонирование, уведомление и ожидание в многопоточных средах, а также для работы с хеш-таблицами. Играют важную роль в проектировании и реализации Java-программ.

Примеры ответов
Список всех вопросов на Java Developer

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16👀31🔥1
Что известно про иерархию исключений ?
Спросят с вероятностью 69%

Иерархия исключений организована в виде дерева наследования, где все классы исключений являются потомками класса Throwable. Он делится на два основных подкласса: Error и Exception.

1️⃣ Throwable
От него напрямую наследуются классы Error и Exception. Этот класс содержит методы для получения сообщения об ошибке, локализованного сообщения, причины исключения и стека вызовов, а также методы для подавления исключений и работы со стеком вызовов.

2️⃣ Error
Error описывает серьёзные ошибки, возникающие на уровне виртуальной машины и библиотеки языка, из-за которых приложение обычно не может восстановиться. Примеры включают OutOfMemoryError и StackOverflowError. Ошибки этого типа обычно не предназначены для обработки приложением.

3️⃣ Exception
Этот класс и подклассы описывают исключения, с которыми приложение может и должно справиться. Делится на две большие категории: проверяемые(checked exceptions) и непроверяемые исключения (unchecked exceptions).

Проверяемые исключения
Требуют обязательной обработки в блоке try-catch или должны быть объявлены в сигнатуре метода с помощью throws. Они бозначают условия, с которыми приложение может предвидеть и справиться. Примеры включают IOException, FileNotFoundException и ClassNotFoundException.

Непроверяемые исключения
Являются непроверяемыми исключениями. Они обозначают ошибки, такие как неверное приведение типов (ClassCastException), обращение по нулевой ссылке (NullPointerException) и выход за пределы массива (ArrayIndexOutOfBoundsException). Эти исключения не требуют обязательной обработки в блоке try-catch.

Иерархия исключений обеспечивает структурированный и гибкий способ обработки ошибок и исключительных ситуаций в приложениях. Позволяет различать серьёзные проблемы системного уровня, с которыми приложение не может справиться.

Примеры ответов
Список всех вопросов на Java Developer

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍84
Что такое SOLID ?
Спросят с вероятностью 62%

SOLID — это акроним, представляющий пять основных принципов ООП и дизайна, направленных на повышение гибкости, масштабируемости и поддерживаемости ПО. Они помогает избежать проблемы с проектированием, такие как жесткая зависимость между компонентами программы и сложности в внесении изменений или добавлении новых функций.

1️⃣ Принцип единственной ответственности (SRP): Подчеркивает важность разделения функциональности, чтобы каждый класс выполнял только одну задачу.
class UserSettings {
void changeEmail(User user) {
if(checkAccess(user)) {
// Изменение email пользователя
}
}

boolean checkAccess(User user) {
// Проверка прав доступа
return true;
}
}


Здесь класс UserSettings нарушает SRP, если бы в нем также были методы для управления пользователями. Лучше вынести метод checkAccess в отдельный класс.

2️⃣ Принцип открытости/закрытости (OCP): Можно добавлять новую функциональность, не изменяя существующий код.

3️⃣ Принцип подстановки Лисков (LSP): Классы-наследники должны дополнять, а не изменять поведение базовых классов.

4️⃣ Принцип разделения интерфейса (ISP): Этот принцип ведет к созданию узкоспециализированных интерфейсов, вместо одного "толстого" интерфейса.

5️⃣ Принцип инверсии зависимостей (DIP): Оба типа модулей должны зависеть от абстракций. Абстракции не должны зависеть от деталей, а детали должны зависеть от абстракций. Этот принцип направлен на уменьшение зависимостей между модулями программы.

SOLID принципы направлены на создание гибкой, масштабируемой архитектуры, которая легко поддается изменениям и развитию. Используя эти принципы, можно создавать системы, которые легче понимать, поддерживать и расширять.

➡️ Примеры ответов
➡️ Список всех вопросов на Java Developer

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🤯1
Что делает принцип happens before в рамках многопоточности ?
Спросят с вероятностью 12%

Принцип "happens-before" в контексте многопоточности определяет правила, при которых одно действие (операция чтения или записи переменной) считается предшествующим другому действию в исполнении программы. Это ключевой механизм для обеспечения видимости изменений, сделанных одним потоком, другими потоками, а также для гарантии корректной синхронизации между потоками без возникновения гонок данных (race conditions).

Этот принцип устанавливает порядок действий таким образом, что если действие A happens-before действия B, то все изменения, сделанные в A, будут видны в B (и не наоборот). Это не обязательно означает, что A физически выполняется до B, но с точки зрения видимости изменений и порядка операций, JVM и аппаратное обеспечение гарантируют, что B увидит результаты, произведённые A.

Ключевые правила:

1️⃣Правило программного порядка: Операции внутри одного потока выполняются в порядке их программирования. Операции, выполненные ранее в потоке, happens-before операций, выполненных позже.

2️⃣Правило блокировки монитора: Освобождение монитора (выход из синхронизированного блока) happens-before последующего захвата этого же монитора другим потоком.

3️⃣Правило volatile переменных: Запись в volatile переменную happens-before любых последующих чтений этой же переменной другими потоками.

4️⃣Правило передачи по ссылке: Если поток A копирует переменную doSomething в threadB.start(), и threadB видит значение doSomething при запуске, то все действия в A до копирования happens-before действий в threadB.

5️⃣Правило начала потока: Все действия в потоке happens-before любого действия в другом потоке, которое видит, что первый поток был запущен.

6️⃣Правило завершения потока: Все действия в потоке happens-before того, как другой поток успешно возвращает результат из Thread.join() на завершившемся потоке.

Значение принципа:

Этот принцип позволяет понимать и предсказывать поведение многопоточных программ, обеспечивая корректное взаимодействие между потоками. Соблюдение "happens-before" помогает избежать проблем с согласованностью данных, когда изменения, сделанные одним потоком, могут не быть видны другому потоку, что может привести к непредсказуемому поведению программы.

➡️Примеры ответов
➡️ Список всех вопросов на Java Developer

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74🔥3🤯3
Как организована HashMap ?
Спросят с вероятностью 56%

HashMap — это структура данных, которая использует хеш-таблицу для хранения пар "ключ-значение". Gозволяет выполнять операции вставки, удаления и поиска элементов с почти постоянным временем выполнения, что делает её очень эффективной для определённых задач. Вот как она организована:

Внутреннее устройство

1️⃣ Хеш-функция: Ключи хранятся с использованием хеш-функции, которая преобразует ключ в индекс массива. Этот индекс используется для хранения значения в массиве. Она должна равномерно распределять ключи по индексам массива, чтобы минимизировать коллизии.

2️⃣ Массив бакетов (корзин): Внутри, она состоит из массива бакетов, где каждый бакет представляет собой "корзину", которая может хранить одну или более пар "ключ-значение". При добавлении новой пары "ключ-значение", хеш-функция вычисляет индекс бакета для хранения значения на основе хеш-кода ключа.

3️⃣ Связный список или дерево: В случае коллизии, когда два разных ключа имеют одинаковый хеш-код и попадают в один и тот же бакет, HashMap использует структуру данных в виде связного списка или дерева для хранения и разрешения коллизий. После определённого порога коллизий, список преобразуется в дерево для улучшения производительности поиска в этом бакете.

Работа

- Вставка: Для вставки новой пары "ключ-значение", сначала вычисляется хеш-код ключа, затем используется хеш-функция для определения индекса бакета. Если в бакете уже есть элементы, происходит проверка на наличие ключа с таким же хеш-кодом. Если такой ключ найден, его значение обновляется. Если ключ уникален, пара добавляется в бакет.

- Поиск: Поиск значения по ключу также начинается с вычисления хеш-кода ключа, определения индекса бакета и последующего поиска в связном списке или дереве этого бакета.

- Удаление: Удаление пары "ключ-значение" происходит аналогично поиску: сначала находится бакет, затем в нём ищется и удаляется элемент.

Расширение

Когда фактор заполнения HashMap превышает определённый порог, происходит автоматическое расширение массива бакетов и перехеширование всех элементов для равномерного распределения по новому массиву бакетов. Это обеспечивает высокую производительность HashMap даже при большом количестве элементов.

HashMap — это мощная и эффективная структура данных для хранения и быстрого доступа к данным через ключи. Благодаря использованию хеш-таблиц, HashMap обеспечивает быстрые операции вставки, поиска и удаления. Разрешение коллизий с помощью связных списков или деревьев и автоматическое расширение помогают поддерживать производительность на высоком уровне.

➡️ Примеры ответов
➡️ Список всех вопросов на Java Developer

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍9