Java | Вопросы собесов
СтатистикаСайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
- Последний пост
- 11:05
- Последнее чтение
- 13:14
- Постов за неделю
- 15
- Всего постов
- 27
- Тип
- открытый
- Язык
- русский
- Категория
- Технологии (по похожим)
- В каталоге с
- 12 авг.
- 1/24сутки в ленте
- 710
- 1/48двое суток
- 794
- 1/72трое суток
- 856
Медиана по постам, которые мы застали свежими и померили через сутки.
Посты
🤔 Используешь в работе Lambda-выражения? Да, лямбда-выражения являются важной частью современной разработки на Java, и я активно их использую в своей работе. Лямбда-выражения помогают писать более лаконичный и выразительный код, особенно при работе с коллекциями и потоками данных. Вот несколько распространенных случаев использования лямбда-выражений в Java: 🟠Итерация по коллекциям Использование лямбда-выражений с методом forEach позволяет компактно и удобно итерировать по элементам коллекций. List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.forEach(name -> System.out.println(name)); 🟠Фильтрация и преобразование коллекций С использованием Stream API и лямбда-выражений можно легко фильтровать, сортировать и преобразовывать коллекции. List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David"); List<String> filteredNames = names.stream() .filter(name -> name.startsWith("A")) .collect(Collectors.toList()); filteredNames.forEach(System.out::println); // Вывод: Alice 🟠Сортировка коллекций Лямбда-выражения упрощают сортировку коллекций с использованием метода sort. List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.sort((name1, name2) -> name1.compareTo(name2)); names.forEach(System.out::println); 🟠Использование функциональных интерфейсов Лямбда-выражения широко используются с функциональными интерфейсами, такими как Predicate, Function, Consumer и Supplier. // Predicate Predicate<String> startsWithA = s -> s.startsWith("A"); boolean result = startsWithA.test("Alice"); // true // Function Function<String, Integer> lengthFunction = s -> s.length(); int length = lengthFunction.apply("Hello"); // 5 // Consumer Consumer<String> printConsumer = s -> System.out.println(s); printConsumer.accept("Hello, World!"); // Вывод: Hello, World! // Supplier Supplier<String> stringSupplier = () -> "Hello, Supplier!"; String suppliedString = stringSupplier.get(); System.out.println(suppliedString); // Вывод: Hello, Supplier! 🟠Параллельные вычисления Лямбда-выражения с использованием параллельных потоков позволяют легко выполнять параллельные вычисления. List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.parallelStream() .mapToInt(Integer::intValue) .sum(); System.out.println("Sum: " + sum); // Вывод: Sum: 15 🚩Пример использования в реальном проекте Предположим, у нас есть список сотрудников, и мы хотим отфильтровать и отсортировать их по имени. import java.util.*; import java.util.stream.Collectors; class Employee { private String name; private int age; public Employee(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Employee{name='" + name + "', age=" + age + '}'; } } public class LambdaExample { public static void main(String[] args) { List<Employee> employees = Arrays.asList( new Employee("Alice", 30), new Employee("Bob", 25), new Employee("Charlie", 35), new Employee("David", 28) ); // Фильтрация и сортировка сотрудников по имени List<Employee> filteredAndSorted = employees.stream() .filter(e -> e.getAge() > 27) .sorted(Comparator.comparing(Employee::getName)) .collect(Collectors.toList()); filteredAndSorted.forEach(System.out::println); } } Ставь 👍 и забирай 📚 Базу знаний
видео или голосовое, без подписи
🤔 Что такое HQL? HQL (Hibernate Query Language) – это язык запросов, используемый в Hibernate (фреймворке для работы с базами данных в Java), который похож на SQL, но оперирует не таблицами и столбцами, а объектами и их свойствами. 🚩Зачем нужен HQL? Когда мы работаем с базами данных в Hibernate, мы используем объектно-реляционное отображение (ORM), где каждая таблица представляется как класс, а строки – как объекты. Однако иногда нам нужно делать запросы к базе данных, например: Получить список объектов, соответствующих определённому критерию Отфильтровать, отсортировать или объединить данные Выполнить массовое обновление или удаление Можно, конечно, использовать чистый SQL, но тогда мы потеряем преимущества ORM, такие как переносимость кода между разными базами данных. HQL решает эту проблему, позволяя писать запросы в объектных терминах, а Hibernate сам преобразует их в правильный SQL для конкретной базы данных. 🚩Как выглядит HQL? HQL очень похож на SQL, но вместо таблиц и столбцов мы используем имена классов и их полей. 🟠Пример 1: Получение списка объектов Допустим, у нас есть класс User, связанный с таблицей users: @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private int age; // Геттеры и сеттеры } Теперь напишем HQL-запрос, чтобы получить всех пользователей старше 18 ле String hql = "FROM User WHERE age > 18"; List<User> users = session.createQuery(hql, User.class).getResultList(); Выборка только имен пользователей String hql = "SELECT u.name FROM User u"; List<String> names = session.createQuery(hql, String.class).getResultList(); Запрос с параметрами (предотвращает SQL-инъекции) String hql = "FROM User WHERE name = :name"; Query<User> query = session.createQuery(hql, User.class); query.setParameter("name", "Иван"); List<User> users = query.getResultList(); 🚩Плюсы ➕Независимость от СУБД HQL автоматически адаптируется под MySQL, PostgreSQL, Oracle и другие базы. ➕Оперирование объектами вместо таблиц и столбцов мы работаем с сущностями (классами Java). ➕Безопасность использование параметров (setParameter()) предотвращает SQL-инъекции. ➕Гибкость поддержка JOIN, GROUP BY, ORDER BY и других SQL-конструкций. Ставь 👍 и забирай 📚 Базу знаний
видео или голосовое, без подписи
🤔 Какая основная идея equals и hashCode? Метод equals определяет, равны ли два объекта по содержимому, а hashCode возвращает целое число, представляющее объект в хэш-структурах. Основная идея — если два объекта равны по equals, их hashCode должен совпадать. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
🤔 Как работать на Spring? Spring – это мощный фреймворк для разработки Java-приложений, который упрощает работу с бэкендом, базами данных и веб-сервисами. 🚩Основные шаги для работы на Spring 1⃣Настроить проект 2⃣Создать контроллеры (обрабатывают HTTP-запросы). 3⃣Добавить сервисы (логика приложения). 4⃣Работать с базой данных (Spring Data JPA, Hibernate). 5⃣Запустить приложение и тестировать. 🚩Настройка проекта (Spring Boot) 🟠Создание проекта через Spring Initializr Самый быстрый способ – использовать [Spring Initializr](https://start.spring.io/). Заходим на [start.spring.io](https://start.spring.io/) Выбираем: Maven / Gradle Java 17+ Spring Boot 3+ Зависимости: Spring Web, Spring Data JPA, PostgreSQL/MySQL (если нужна БД) Скачиваем и открываем в IntelliJ IDEA или VS Code. <dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Boot JPA + Hibernate --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- Драйвер для PostgreSQL --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> </dependency> <!-- Lombok (автоматически генерирует геттеры/сеттеры) --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> </dependencies> 🚩Создание контроллера (REST API) Контроллер обрабатывает HTTP-запросы (GET, POST, PUT, DELETE). @RestController @RequestMapping("/hello") public class HelloController { @GetMapping public String sayHello() { return "Привет, Spring!"; } } Запрос в браузере http://localhost:8080/hello Ответ Привет, Spring! 🚩Добавление бизнес-логики (Service Layer) Сервисы обрабатывают данные и реализуют бизнес-логику. @Service public class UserService { public String getUserGreeting(String name) { return "Привет, " + name + "!"; } } Использование сервиса в контроллере @RestController @RequestMapping("/user") public class UserController { private final UserService userService; @Autowired // Внедрение зависимости public UserController(UserService userService) { this.userService = userService; } @GetMapping("/{name}") public String getUserGreeting(@PathVariable String name) { return userService.getUserGreeting(name); } } Запрос в браузере: http://localhost:8080/user/Иван Ответ Привет, Иван! Ставь 👍 и забирай 📚 Базу знаний
видео или голосовое, без подписи
🤔 Что такое livelock? Livelock — это ситуация, в которой потоки продолжают реагировать друг на друга, но не могут продвинуться в выполнении задач, например, из-за постоянных попыток избежать конфликта. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
видео или голосовое, без подписи
🤔 Как ты можешь описать абстракцию? Это принцип объектно-ориентированного программирования (ООП), который скрывает детали реализации объекта и показывает только его наиболее важные характеристики. Она позволяет сосредоточиться на сущности объекта, игнорируя его внутреннюю сложность. 🚩Абстракция В Java абстракция достигается через: Абстрактные классы Интерфейсы 🟠Абстрактные классы Абстрактный класс — это класс, который не может быть создан напрямую, но может содержать: Абстрактные методы (без реализации, только сигнатуры); Обычные методы (с реализацией). Используется, если вы хотите описать общее поведение для группы классов, но часть поведения оставить на усмотрение конкретных подклассов. abstract class Animal { // Абстрактный метод — реализуется в подклассах abstract void makeSound(); // Обычный метод void eat() { System.out.println("This animal eats food."); } } class Dog extends Animal { @Override void makeSound() { System.out.println("Woof!"); } } class Cat extends Animal { @Override void makeSound() { System.out.println("Meow!"); } } public class Main { public static void main(String[] args) { Animal dog = new Dog(); dog.makeSound(); // Woof! dog.eat(); // This animal eats food. Animal cat = new Cat(); cat.makeSound(); // Meow! } } 🟠Интерфейсы Интерфейс — это чистый контракт, который определяет набор методов, которые класс должен реализовать. В отличие от абстрактного класса: Интерфейс не может содержать полей (кроме static final). Класс может реализовать несколько интерфейсов (множественное наследование). interface Vehicle { void start(); // метод без реализации void stop(); } class Car implements Vehicle { @Override public void start() { System.out.println("Car is starting."); } @Override public void stop() { System.out.println("Car is stopping."); } } class Bike implements Vehicle { @Override public void start() { System.out.println("Bike is starting."); } @Override public void stop() { System.out.println("Bike is stopping."); } } public class Main { public static void main(String[] args) { Vehicle car = new Car(); car.start(); // Car is starting. car.stop(); // Car is stopping. Vehicle bike = new Bike(); bike.start(); // Bike is starting. bike.stop(); // Bike is stopping. } } 🚩Почему важна абстракция? 🟠Скрытие сложностей Программистам не нужно знать все детали реализации объекта. Они работают только с его интерфейсом. 🟠Упрощение понимания Код становится понятным и модульным, так как мы сосредоточиваемся на важной логике. 🟠Повторное использование Абстракция позволяет использовать один и тот же код для разных объектов. 🟠Гибкость и поддержка Если нужно изменить реализацию, это не затронет остальную часть программы (если она работает через абстрактный контракт). Ставь 👍 и забирай 📚 Базу знаний
видео или голосовое, без подписи
🤔 Чем отличаются HashSet и LinkedHashSet? - HashSet: - Быстрая вставка и поиск. - Не сохраняет порядок элементов. - LinkedHashSet: - Также использует хеш-таблицу. - Сохраняет порядок вставки элементов. Выбирают в зависимости от требований к порядку. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
🤔 Что за исключение Interrupted Exception? InterruptedException — это проверяемое исключение (checked exception) в Java, которое выбрасывается, когда поток (Thread) прерывается во время выполнения метода, который поддерживает прерывание (например, sleep(), wait(), join() и др.). 🚩Почему `InterruptedException` существует? В многопоточной среде иногда требуется прервать выполнение потока, например, для завершения долгой задачи или для корректной остановки программы. Вместо грубого завершения потока (Thread.stop(), который устарел и считается небезопасным) Java предлагает мягкий способ прерывания через флаг прерывания и обработку InterruptedException. 🚩Когда выбрасывается `InterruptedException`? Это исключение выбрасывается, если поток: 1. Ожидает (wait(), join()) 2. Спит (sleep()) 3. Блокируется на очереди (BlockingQueue.take(), LockSupport.park()) И при этом его прерывают с помощью метода interrupt(). Пример кода: обработка InterruptedException class MyThread extends Thread { public void run() { try { System.out.println("Поток засыпает..."); Thread.sleep(5000); // Поток засыпает на 5 секунд } catch (InterruptedException e) { System.out.println("Поток был прерван во время сна!"); } System.out.println("Поток продолжает работу..."); } } public class Main { public static void main(String[] args) { MyThread t = new MyThread(); t.start(); try { Thread.sleep(2000); // Даем потоку 2 секунды поработать } catch (InterruptedException e) { e.printStackTrace(); } t.interrupt(); // Прерываем поток } } Вывод программы Поток засыпает... Поток был прерван во время сна! Поток продолжает работу... 🚩Что делать после `InterruptedException`? 1. Просто обработать исключение (как в примере выше). 2. Передать исключение дальше — например, если метод не может корректно обработать прерывание, он передает его вызывающему коду: void myMethod() throws InterruptedException { Thread.sleep(1000); // Может выбросить исключение } 🟠Восстановить флаг прерывания если прерывание важно для логики программы: catch (InterruptedException e) { Thread.currentThread().interrupt(); // Восстанавливаем флаг прерывания } Ставь 👍 и забирай 📚 Базу знаний
видео или голосовое, без подписи
🤔 Что такое HQL? HQL (Hibernate Query Language) — это язык запросов, похожий на SQL, но оперирующий Java-классами и их свойствами, а не таблицами и колонками. Он позволяет работать с объектной моделью и использовать возможности Hibernate ORM. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
🤔 Чем stub отличается от mock? В тестировании разница между Stub и Mock заключается в их предназначении и способе использования. 🚩Stub (Заглушка) Stub – это простейший объект-заглушка, который возвращает заранее заданные данные. Он не проверяет, какие методы были вызваны, а просто отвечает на запросы. class UserRepositoryStub implements UserRepository { @Override public User findById(Long id) { return new User(id, "Иван"); // Просто возвращает статичные данные } } 🚩Mock (Макет) Mock – это объект, который имитирует поведение реального объекта и позволяет проверять вызовы методов (сколько раз был вызван, с какими аргументами и т. д.). UserRepository userRepository = mock(UserRepository.class); when(userRepository.findById(1L)).thenReturn(new User(1L, "Иван")); User user = userRepository.findById(1L); verify(userRepository, times(1)).findById(1L); // Проверяем, что метод был вызван 1 раз Ставь 👍 и забирай 📚 Базу знаний
видео или голосовое, без подписи
🤔 Что такое Web application? Web application (веб-приложение) — это программное приложение, которое работает на веб-сервере и доступно пользователям через веб-браузер с использованием сети (например, Интернета). Примеры: интернет-магазины, почтовые клиенты, CRM-системы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
🤔 К какой категории сущности относится Primary Key? Primary Key (первичный ключ) в базах данных относится к категории ограничений (constraints). Это специальное ограничение, которое накладывается на столбец или группу столбцов таблицы, чтобы однозначно идентифицировать каждую строку (запись) в таблице. 🚩Основные свойства Primary Key 🟠Уникальность Значение первичного ключа должно быть уникальным для каждой строки. Это исключает дублирование записей. 🟠Не может быть NULL Столбец (или столбцы), определённый как Primary Key, не допускает значения NULL, так как NULL не может однозначно идентифицировать строку. 🟠Только один Primary Key на таблицу Таблица может иметь только один первичный ключ, но он может состоять из одного столбца (простой ключ) или нескольких (составной ключ). 🚩Зачем нужен Primary Key? Для однозначной идентификации записей в таблице. Для создания связей между таблицами в реляционных базах данных (внешние ключи ссылаются на первичный ключ другой таблицы). Для ускорения поиска и манипуляций с данными за счёт создания индекса на столбец первичного ключа. 🚩Пример использования Primary Key Простой первичный ключ CREATE TABLE Users ( user_id INT PRIMARY KEY, username VARCHAR(50), email VARCHAR(100) ); Составной первичный ключ CREATE TABLE Orders ( order_id INT, product_id INT, PRIMARY KEY (order_id, product_id) ); Ставь 👍 и забирай 📚 Базу знаний
🤔 Какие методы располагаются в интерфейсе? В интерфейсе могут быть абстрактные методы, которые по умолчанию являются public и abstract. Java 8 добавила методы с реализацией по умолчанию (default) и статические методы (static). Также можно использовать приватные методы (private) для внутренних нужд интерфейса. Это делает интерфейсы более функциональными и гибкими для расширения. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний