Тех собес на middle Java Разработчик в ****

Доступно с премиум-подпиской

Оформите премиум-подписку, чтобы получить доступ к:

  • Фильтрации по компаниям
  • Названиям компаний в интервью
  • Видеозаписям собеседований в категории Java Разработчик

Посмотреть видео в категории

(2024-09-04)

Техническое собеседование

  • Расскажите про проект, про интересные задачи.

Вопросы по 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. Выведите список групп студентов в виде: название группы, фамилия, имя, отчество.
    2. Найти все группы, в которых более 1 го студента. Вывести: название группы, кол-во студентов.

Задачи по System Design / Архитектуре

  • Задача на проектирование сущностей:
    • Имеем сущности: прямоугольник, окружность.
    • При развитии системы, ожидаются новые типы фигур.
    • Для каждой из сущностей нужно знать: 1) Название, 2) Площадь, 3) Периметр.
    • Вопросы:
      1. Опишите бизнес классы (без привязки к ОРМ).
      2. Опишите интерфейс(или интерфейсы) работы с сущностями, которые должны обеспечить следующие потребности:
        • 2.1) Создание фигуры
        • 2.2) Поиск фигуры по имени
        • 2.3) Поиск по диапазону значений площади (>= minVal <=maxVal)
        • 2.4) Поиск по диапазону значений периметра (>= minVal <=maxVal)
        • 2.5) Поиск по диапазону значения радиуса (>= minVal <=maxVal)
        • 2.6) Поиск по диапазону значения наибольшей стороны прямоугольника (>= minVal <=maxVal)
    • Примечание: Их нужно хранить в базе данных.

Вложения

42_1019_photo.jpg

42_1020_photo.jpg

42_1021_photo.jpg

42_1022_photo.jpg

42_1023_photo.jpg

42_1024_photo.jpg

42_1025_photo.jpg

42_1026_photo.jpg

42_1027_photo.jpg

42_1028_photo.jpg

42_1030_photo.jpg