☕ Вопросы интервью по Java

Вопросы 181-190 для опытных разработчиков

Вопрос 181
Какая разница между методами sleep() и wait()?

Ответ: Sleep() и wait() — это два различных метода для приостановки потока, но они работают по-разному:

Сравнительная таблица:
Характеристика sleep() wait()
Принадлежность Метод класса Thread Метод класса Object
Освобождение блокировки Не освобождает lock, который держит поток Освобождает lock, что позволяет другим потокам его получить
Тип метода Статический метод Не является статическим методом
InterruptedException Не выбрасывает InterruptedException Выбрасывает InterruptedException если поток прерван
Использование Используется для задержки потока на определенное время Используется для паузы потока, пока другой поток не пробудит его
Перегруженные методы sleep(long millis), sleep(long millis, int nanos) wait(), wait(long timeout), wait(long timeout, int nanos)
Примеры использования:

Sleep() пример:


// Sleep() просто останавливает поток на время
try {
    Thread.sleep(2000);  // Поток ждет 2 секунды
    System.out.println("After 2 seconds");
} catch (InterruptedException e) {
    e.printStackTrace();
}
                

Wait() пример:


// Wait() ждет уведомления от другого потока
synchronized(obj) {
    try {
        obj.wait();  // Поток ждет, пока другой поток не вызовет notify()
        System.out.println("Notified by another thread");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

// В другом потоке:
synchronized(obj) {
    obj.notify();  // Пробуждает ждущий поток
}
                
Ключевое отличие:
  • sleep(): Поток остается в sleep состоянии, но не освобождает lock. Другие потоки не могут войти в synchronized блок.
  • wait(): Поток освобождает lock и ждет уведомления. Другие потоки могут войти в synchronized блок.
Вопрос 182
Какие различные типы приоритетов потоков в Java? Какой приоритет по умолчанию?

Ответ: Приоритеты потоков — это концепция, где каждый поток имеет приоритет, который представлен числами от 1 до 10. Существуют различные типы приоритетов потоков в Java:

Типы приоритетов:
Приоритет Значение Константа Описание
Минимальный 1 MIN_PRIORITY Самый низкий приоритет
Нормальный 5 NORM_PRIORITY Приоритет по умолчанию
Максимальный 10 MAX_PRIORITY Самый высокий приоритет

По умолчанию потокам назначается NORM_PRIORITY (5).

Пример использования приоритетов:

class PriorityThreadDemo extends Thread {
    public void run() {
        System.out.println("Thread: " + Thread.currentThread().getName() 
            + ", Priority: " + Thread.currentThread().getPriority());
    }
}

public class ThreadPriorityExample {
    public static void main(String[] args) {
        PriorityThreadDemo t1 = new PriorityThreadDemo();
        PriorityThreadDemo t2 = new PriorityThreadDemo();
        PriorityThreadDemo t3 = new PriorityThreadDemo();
        
        t1.setPriority(Thread.MIN_PRIORITY);  // Приоритет 1
        t2.setPriority(Thread.NORM_PRIORITY); // Приоритет 5 (по умолчанию)
        t3.setPriority(Thread.MAX_PRIORITY);  // Приоритет 10
        
        t1.start();
        t2.start();
        t3.start();
    }
}

// Output:
// Thread: Thread-2, Priority: 10
// Thread: Thread-1, Priority: 5
// Thread: Thread-0, Priority: 1
                
Методы для работы с приоритетами:
  • setPriority(int newPriority) — устанавливает приоритет потока
  • getPriority() — получает приоритет текущего потока
Вопрос 183
Почему Garbage Collection необходим в Java?

Ответ: Для Java Garbage Collection необходим для избежания утечек памяти, которые могут привести к краху программы и её нестабильности. В отличие от C++, в Java нет способа удалить сборку мусора в пользу разработчика для фокусирования на разработке приложения вместо управления ресурсами памяти и беспокойства об утечке памяти.

Причины необходимости Garbage Collection:
  • Предотвращение утечек памяти: GC автоматически удаляет неиспользуемые объекты
  • Стабильность приложения: Без GC программа может просто остановиться из-за OutOfMemoryError
  • Автоматическое управление: Разработчики могут сосредоточиться на логике приложения
  • Эффективность памяти: JVM автоматически управляет памятью, периодически запуская сборщик мусора
  • Безопасность памяти: Удаляются нерефрентные объекты из heap памяти
Как работает Garbage Collection:

JVM автоматически управляет памятью, периодически запуская сборщик мусора, который освобождает неиспользуемую память в приложении.

Пример проблемы без GC (как в C++):

// Без GC нужно было бы вручную освобождать память:
// Object obj = new Object();
// // использование объекта
// delete obj;  // В C++ нужна явная очистка
// 
// В Java это делается автоматически:
Object obj = new Object();
// использование объекта
// После того как obj больше не используется, GC удалит его автоматически
                
Вопрос 184
Какие недостатки Garbage Collection?

Ответ: Несмотря на множество преимуществ, Garbage Collector имеет определенные недостатки:

Основные недостатки:
  • Паузы в выполнении: Основным недостатком Garbage Collection является то, что он может вызвать паузы в выполнении приложения, когда он работает для очистки памяти, что замедляет производительность приложения.
  • Непредсказуемость: Процесс Garbage Collection недетерминирован, что затрудняет предсказать, когда произойдет сборка мусора, что вызывает непредсказуемое поведение в приложениях. Например, если мы напишем любую программу, то для программистов сложно определить, вызвана ли проблема сборкой мусора или другими факторами в программе.
  • Увеличение использования памяти: Garbage Collection может увеличить использование памяти, если программа создает и отбрасывает много краткосрочных объектов.
Примеры проблем:

Проблема 1: Паузы выполнения

  • Когда GC запускается, приложение может заметить задержку в ответе
  • Это критично для real-time приложений и высоконагруженных систем

Проблема 2: Непредсказуемость

  • Трудно предсказать когда произойдет GC
  • Это может привести к неопределенному поведению

Проблема 3: Overhead памяти

  • Сам GC требует дополнительной памяти для отслеживания объектов
  • Может привести к фрагментации памяти
Вопрос 185
Объясните разницу между minor, major и full garbage collection

Ответ: JVM удаляет объекты, которые больше не используются, используя сборщик мусора, который периодически проверяет и удаляет эти объекты. Существуют различные типы сборки мусора в JVM, каждый с различными характеристиками и влиянием на производительность. Основные типы сборки мусора:

Типы Garbage Collection:
Тип Область памяти Объекты Время
Minor GC Young Generation (молодое поколение) Краткоживущие объекты (быстро создаются и удаляются) Выполняется часто и быстро
Major GC Old Generation (старое поколение) Долгоживущие объекты (пережили несколько minor GC) Выполняется реже, но медленнее
Full GC Все поколения (Young + Old + Permanent) Все объекты из всех поколений Выполняется редко, самый медленный
Подробное объяснение:

Minor Garbage Collection (Young Generation GC):

Также известна как сборка мусора молодого поколения. Этот тип сборки мусора используется для сбора и восстановления памяти, которая используется объектами с коротким жизненным циклом (объектами, которые быстро создаются и отбрасываются).

Major Garbage Collection (Old Generation GC):

Также известна как сборка мусора старого поколения. Этот тип сборки мусора используется для сбора и восстановления памяти, которая используется долгоживущими объектами (объектами, которые пережили несколько minor garbage collection и продвинулись в old generation).

Full Garbage Collection:

Во время полной сборки мусора памяти из всех поколений собираются и восстанавливаются, включая памяти молодого и старого поколения. Full garbage collection обычно требует больше времени на выполнение, чем minor или major garbage collection, что вызывает, что приложение паузируется временно.

Вопрос 186
Что такое утечка памяти и как она влияет на garbage collection?

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

Как утечка памяти влияет на GC:

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

Пример утечки памяти:

// Java Program to demonstrate memory leaks
import java.io.*;
import java.util.Vector;

class GFG {
    public static void main(String[] args) {
        Vector a = new Vector(21312312);
        Vector b = new Vector(2147412344);
        Vector c = new Vector(219944);
        System.out.println("Memory Leak in Java");
    }
}

// Output:
// Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
//     at java.base/java.util.Vector.<init>(Vector.java:142)
//     at GFG.main(GFG.java:9)
                
Причины утечек памяти:
  • Незакрытые ресурсы (файлы, соединения БД)
  • Неправильное управление слушателями (listeners)
  • Циклические ссылки между объектами
  • Сохранение ссылок на большие объекты дольше необходимо
Как избежать утечек памяти:
  • Используйте try-with-resources для автоматического закрытия ресурсов
  • Явно устанавливайте ненужные ссылки в null
  • Правильно управляйте слушателями (удаляйте их когда они больше не нужны)
  • Используйте WeakReference для больших объектов
Вопрос 187
Назовите некоторые классы, присутствующие в пакете java.util.regex

Ответ: Regular Expressions или Regex в Java — это API, используемый для поиска и манипулирования строк в Java. Он создает String паттерны, которые могут извлечь нужные данные из строк или могут обобщить паттерн.

Классы в пакете java.util.regex:
Класс Описание
Pattern Class Может определять паттерны. Используется для определения регулярных выражений.
Matcher Class Может выполнять операции сопоставления текста с использованием паттернов
PatternSyntaxException Class Может указать синтаксическую ошибку в регулярном выражении
Также в пакете присутствует интерфейс:
  • MatchResult Interface: Может использоваться для представления результата операции сопоставления
Пример использования Pattern и Matcher:

import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        // Определение паттерна
        String pattern = "[0-9]+";
        Pattern p = Pattern.compile(pattern);
        
        String input = "There are 25 apples and 17 oranges";
        Matcher m = p.matcher(input);
        
        // Поиск всех чисел
        while (m.find()) {
            System.out.println("Found: " + m.group());
        }
    }
}

// Output:
// Found: 25
// Found: 17
                
Вопрос 188
Напишите regular expression для валидации пароля

Ответ: Пароль должен начинаться с алфавита, за которым следуют буквально-цифровые символы; его длина должна быть между 8 и 20.

Regular Expression для пароля:

regex = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,20}$"
                
Объяснение компонентов:
  • ^ — начало строки
  • (?=.*[0-9]) — по крайней мере одна цифра должна присутствовать
  • (?=.*[a-z]) — по крайней мере одна строчная букв должна присутствовать
  • (?=.*[A-Z]) — по крайней мере одна прописная буква должна присутствовать
  • (?=.*[@#$%^&+=]) — по крайней мере один специальный символ должен присутствовать
  • (?=\\S+$) — пробелы не разрешены во всей строке
  • .{8, 20} — минимум 8 символов и максимум 20 символов
  • $ — конец строки
Пример Java кода:

import java.util.regex.*;

public class PasswordValidator {
    public static void main(String[] args) {
        String pattern = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,20}$";
        Pattern p = Pattern.compile(pattern);
        
        String password1 = "Secure@123";
        String password2 = "weak";
        
        Matcher m1 = p.matcher(password1);
        Matcher m2 = p.matcher(password2);
        
        System.out.println("Password1: " + m1.matches());  // true
        System.out.println("Password2: " + m2.matches());  // false
    }
}
                
Вопрос 189
Что такое JDBC?

Ответ: JDBC (Java Database Connectivity) standard API используется для связи Java приложений и реляционных баз данных. Она предоставляет коллекцию классов и интерфейсов, которые позволяют программистам использовать язык программирования Java для общения с базой данных. Классы и интерфейс JDBC позволяют приложению отправлять запросы, сделанные пользователями, на указанную базу данных.

Четыре основных компонента JDBC:
  • JDBC API: Предоставляет интерфейсы и классы для подключения к базе данных
  • JDBC Driver Manager: Управляет различными драйверами JDBC
  • JDBC Test Suite: Поддержка для тестирования JDBC
  • JDBC-ODBC Bridge Drivers: Мостит соединение между JDBC и ODBC
Архитектура JDBC:

Application → JDBC API → JDBC Driver Manager → JDBC Driver → SQL Server/Oracle/MySQL

Вопрос 190
Что такое JDBC Driver?

Ответ: JDBC Driver — это программный компонент, который используется для включения Java приложения для взаимодействия с базой данных. JDBC предоставляет реализацию JDBC API для конкретной системы управления базой данных, которая позволяет ему подключиться к базе данных, выполнять SQL-операции и получить данные. Существует четыре типа JDBC драйверов:

Четыре типа JDBC драйверов:
  • JDBC-ODBC Bridge driver: Соединяет JDBC с ODBC драйверами
  • Native-API driver: Использует нативные API конкретной БД
  • Network Protocol driver: Использует middleware для взаимодействия с БД
  • Thin driver: Полностью на Java, напрямую обращается к БД
Архитектура JDBC Driver:

Приложение → JDBC API → JDBC Driver → Oracle/MySQL/SQL Server

Основные методы Connection класса:
  • DriverManager.getConnection() — получить соединение с БД
  • statement = connection.createStatement() — создать statement
  • resultSet = statement.executeQuery() — выполнить SELECT query
  • connection.close() — закрыть соединение