Техническое собеседование
- Расскажите про проект, про интересные задачи.
Вопросы по Java Core / OOP
- Про Equals и hashcode.
- Про кэш первого уровня. Когда объекты попадают в кэш первого уровня? (После сохранения)
- Про ленивую инициализацию, зачем нужна?
- Как создавать свою аннотацию?
- Как внедрять значение из проперти файла не используя
@Value? - Задача по Java
==оператору:package interview; public class Main { private static int STATIC_INT_FIELD = 200; public static void main(String[] args) { String a = "ABC"; String b = "ABC"; System.out.println(a == b); Integer c = 200; Integer d = 200; System.out.println(c == d); int e = 300; int f = 300; System.out.println(e == f); Object o1 = new Object(); Object o2 = new Object(); System.out.println(o1 == o2); System.out.println(STATIC_INT_FIELD); } }Что будет выведено в консоль?
- Вопросы по классу
ListaNaturais:package interview; import java.util.ArrayList; import java.util.List; public class ListaNaturais { private List<Integer> numeros = new ArrayList<>(); public ListaNaturais(List<Integer> numeros) { for (Integer numero : numeros) { if (numero < 0) throw new IllegalArgumentException("Os números devem ser naturais (>= 0)"); } this.numeros = numeros; } public ListaNaturais(Integer... numeros) { for (Integer numero : numeros) { add(numero); } } public void add(Integer numero) { if (numero < 0) throw new IllegalArgumentException("O número deve ser natural (>= 0)"); numeros.add(numero); } public boolean remove(Integer numero) { return numeros.remove(numero); } public List<Integer> getNumeros() { return numeros; } }Вопросы по поведению конструкторов, валидации, коллекциям.
- Задача по обработке исключений:
public class IllegalArgumentExceptionExt extends IllegalArgumentException { public IllegalArgumentExceptionExt(String str) { super(str); } } public class TestException { public static void main(String[] args) { try { if (true) throw new IllegalArgumentExceptionExt("demo exception"); } catch (NumberFormatException ex) { // 1 System.out.println("1 " + ex.getClass().getSimpleName()); throw ex; } catch (IllegalArgumentExceptionExt ex) { // 2 System.out.println("2 " + ex.getClass().getSimpleName()); throw ex; } catch (IllegalArgumentException ex) { // 3 System.out.println("3 " + ex.getClass().getSimpleName()); throw ex; } catch (RuntimeException ex) { // 4 System.out.println("4 " + ex.getClass().getSimpleName()); throw ex; } catch (Exception ex) { // 5 System.out.println("5 " + ex.getClass().getSimpleName()); throw ex; } catch (Throwable ex) { // 6 System.out.println("6 " + ex.getClass().getSimpleName()); throw ex; } finally { // 7 System.out.println("finally"); } System.out.println("end"); // 8 } }Есть исключение:
IllegalArgumentExceptionExt. В какие блоки кода мы попадем: 1, 2, 3, 4, 5, 6, 7, 8? - Задача по абстрактным классам и дженерикам:
Имеем базовый абстрактный класс public abstract class DemoAbstractClass<T> { abstract T createNewPojo(); } Pojo Классы @Data public class DemoPojo1 { private String name; } @Data public class DemoPojo2 { private String name; } Наследники: public class ExtDemo extends DemoAbstractClass<DemoPojo1> { @Override DemoPojo1 createNewPojo() { return new DemoPojo1(); } } public class ExtDemo extends DemoAbstractClass<DemoPojo2> { @Override DemoPojo2 createNewPojo() { return new DemoPojo2(); } }Возможно ли функционал
createNewPojoреализовать в абстрактном классе? И если да, то как… - Задача по
try-with-resourcesиfinally:public static void main(String[] args) { try (DemoObject demo = new DemoObject()) { System.out.println("что то делаем"); } catch (Exception ex) { throw ex; } finally { System.out.println("finally"); } }Вопрос по порядку выполнения кода.
- Задача по передаче объектов и изменению ссылок:
@Data @AllArgsConstructor public class ParamSimpleWrap { private Long val; } public class CalcBean { public void calc(ParamSimpleWrap p1, ParamSimpleWrap p2) { p1.setVal(1L); p2 = new ParamSimpleWrap(2L); } } // тестовый вызов public static void main(String[] args) { CalcBean calcBean = new CalcBean(); var p1 = new ParamSimpleWrap(0L); var p2 = new ParamSimpleWrap(0L); calcBean.calc(p1, p2); System.out.println("p1.val=" + p1.getVal()); System.out.println("p2.val=" + p2.getVal()); }Что мы увидим в консоли при вызове метода main:
p1.val=?,p2.val=??
Вопросы по Spring / Hibernate / JPA
- Проблема n+1. Как решать?
- Про пессимистичную блокировку.
- Про
@Transactionalи его параметры. - Почему не создаётся прокси, если из одного транзакционного метода вызвать другой в рамках одного класса?
- Как влиять на запросы до поступления их на контроллер? (про фильтры хотели услышать)
- Про уровни изоляции спросили. Подробно про Repeatable Read.
- Задача по транзакциям в Kotlin/Spring:
package ru.jsa.opm.main.service import ... @Service class MyService(private val repository: DemoRepository) { @Transactional(propagation = Propagation.REQUIRES_NEW) suspend fun method1() { repository.save(Demo(id = 1, name = "Demo1")) method2() } @Transactional(propagation = Propagation.REQUIRES_NEW) suspend fun method2() { repository.save(Demo(id = 2, name = "Demo2")) } }Вопрос по поведению транзакций при вызове
method2изmethod1в рамках одного класса сPropagation.REQUIRES_NEW. - Задача по
@Transactionalна приватном методе:@Controller public class ServiceControllerDemo { public String doInTransaction(RequestParams params){ .... return inTransaction(params); } @Transactional() private String inTransaction(RequestParams params){ .... } }Мы получим ожидаемое поведение (транзакционное) при вызове приватного
@Transactionalметода из публичного не-транзакционного метода в том же классе? - Задача по Spring DI и нескольким бинам:
public interface IBeanDemo { Long calculate(Long value); } @Component public class Bean1 implements IBeanDemo { @Override public Long calculate(Long value) { return 1L; } } @Component public class Bean2 implements IBeanDemo { @Override public Long calculate(Long value) { return 2L; } } @RestController () @RequestMapping("demorestql") @RequiredArgsConstructor public class DemoRestQl { private final IBeanDemo bean; @GetMapping("/calculate/{id}") public Long runMethod(@PathVariable Long id) { return bean.calculate(id); } }Этот проект соберется? Этот проект запустится?
Вопросы по Git
- Какие гит команды знаешь кроме пуш, комит? Про rebase vs merge, reset vs revert.
Алгоритмические задачи / Задачи на код
- Есть коллекция persons с полем: коллекция children (с полем age). Используя stream api найти максимальный возраст детей.
Задачи по SQL
- Схема данных:
group (id, groupname)student2group (id, studentid, groupid)student (id, firstname, lastname, middlename, age)
- Задачи:
- Выведите список групп студентов в виде: название группы, фамилия, имя, отчество.
- Найти все группы, в которых более 1 го студента. Вывести: название группы, кол-во студентов.
Задачи по System Design / Архитектуре
- Задача на проектирование сущностей:
- Имеем сущности: прямоугольник, окружность.
- При развитии системы, ожидаются новые типы фигур.
- Для каждой из сущностей нужно знать: 1) Название, 2) Площадь, 3) Периметр.
- Вопросы:
- Опишите бизнес классы (без привязки к ОРМ).
- Опишите интерфейс(или интерфейсы) работы с сущностями, которые должны обеспечить следующие потребности:
- 2.1) Создание фигуры
- 2.2) Поиск фигуры по имени
- 2.3) Поиск по диапазону значений площади (>= minVal <=maxVal)
- 2.4) Поиск по диапазону значений периметра (>= minVal <=maxVal)
- 2.5) Поиск по диапазону значения радиуса (>= minVal <=maxVal)
- 2.6) Поиск по диапазону значения наибольшей стороны прямоугольника (>= minVal <=maxVal)
- Примечание: Их нужно хранить в базе данных.
Вложения










