java-interview

Собес в ITK Academy · Java Junior

Вопросы, задачи и подготовка к первому техническому интервью.

Темы: Java · Spring · Spring Boot · Docker · SQL · Git · OAuth

← Ко всем гайдам · Канал JavaJub в Telegram


1. Про ITK Academy и формат собеса

ITK Academy — это IT-компания из Таганрога, работающая по принципу аутстаффинга. То есть напрямую к ним «джавистом» ты не идёшь: они дообучают, помогают с резюме и портфолио, а затем устраивают на проекты компаний-партнёров. Это значит, что собес у тебя будет двухэтапный.

Как обычно устроен путь до оффера

Этап С кем Что проверяют
1. Знакомство Менеджер ITK Мотивация, стек, ожидания, опыт обучения
2. Тех-собес Техлид/ментор ITK Java Core, базовые коллекции, ООП, твой pet-проект

внутри

3. Подготовка Ментор Доработка резюме, дообучение пробелов, моки
4. Собес у Тех-команда Глубокий тех-собес под стек заказчика
клиента заказчика  
5. Оффер HR заказчика + ITK Условия, выход на проект

ФИШКА. Главный нюанс Ты готовишься не к одному собесу, а к двум разным. Внутри ITK будут смотреть, насколько тебя «продаваемо» можно отправить клиенту. У клиента — насколько ты вписываешься в их стек и команду. Готовиться нужно по широкой базе.

2. Стек по вакансии

ITK честно расписывает требования к Junior Java на Хабр Карьере. Вот что нужно знать на момент собеса:

Обязательный минимум

Будет плюсом

ВНИМАНИЕ · Что бросается в глаза Стек для Junior довольно широкий — Spring Security, Cloud, OAuth, Keycloak обычно ждут от Middle. Это значит: глубоко знать всё не нужно, но «своими словами объяснить, что это и зачем» — обязательно.

3. Java Core & ООП

Это база — без неё дальше не пускают. Для Junior спрашивают концепты, а не тонкости JMM.

Типовые вопросы

СОВЕТ. Лайфхак На вопрос про ООП всегда заготовь жизненный пример. Например, инкапсуляция — это банкомат: ты не знаешь, как он внутри хранит деньги, у тебя есть только публичные методы «снять», «положить», «проверить баланс». Запоминается и тебе, и интервьюеру.

4. Коллекции

Спрашивают всегда. HashMap и ArrayList — обязательно. Готовься рассказывать «как устроено».

5. Исключения и многопоточность (база)

Для Junior спрашивают самое начало, без JMM и lock-free алгоритмов.

Исключения

Многопоточность — база

6. Spring и Spring Boot

В вакансии ITK прямо упомянуты Spring web, security, data, cloud, test и Spring Boot стартеры. На Junior достаточно базы.

Базовые вопросы

Про Spring Security и Cloud (на пальцах)

7. Docker, Git и CI/CD

Docker

Git

CI/CD

8. Базы данных и SQL

9. Безопасность: OAuth и Keycloak

В вакансии ITK Keycloak отмечен как «преимущество». Глубоко знать не нужно — достаточно общего понимания.

10. Практические задачи

Для Junior на собесе обычно дают что-то из этого списка. Все задачи — реальные форматы с подобных собесов в аутстафф-компаниях.

Задача 1. Развернуть строку

Формулировка: напиши метод, который принимает строку и возвращает её в обратном порядке. Без использования StringBuilder.reverse().

public String reverse(String input) {
    if (input == null) return null;
    char[] chars = input.toCharArray();
    int left = 0, right = chars.length - 1;
    while (left < right) {
        char tmp = chars[left];
        chars[left] = chars[right];
        chars[right] = tmp;
        left++;
        right--;
    }
    return new String(chars);
}

О чём спросят дополнительно:

Задача 2. Проверить палиндром

Формулировка: метод isPalindrome(String s) возвращает true, если строка читается одинаково в обе стороны. Регистр не учитывается, пробелы игнорируются.

public boolean isPalindrome(String s) {
    if (s == null) return false;
    int left = 0, right = s.length() - 1;
    while (left < right) {
        while (left < right && !Character.isLetterOrDigit(s.charAt(left))) left++;
        while (left < right && !Character.isLetterOrDigit(s.charAt(right))) right--;
        if (Character.toLowerCase(s.charAt(left)) !=
            Character.toLowerCase(s.charAt(right))) return false;
        left++;
        right--;
    }
    return true;
}

Задача 3. Подсчитать частоту символов

Формулировка: для строки вернуть Map<Character, Integer> — сколько раз каждый символ встречается.

public Map<Character, Integer> charFrequency(String s) {
    Map<Character, Integer> result = new HashMap<>();
    for (char c : s.toCharArray()) {
        result.merge(c, 1, Integer::sum);
    }
    return result;
}

Альтернатива через Stream API: Map<Character, Long> result = s.chars() .mapToObj(c -> (char) c)

.collect(Collectors.groupingBy(c -> c, Collectors.counting()));

Задача 4. Найти первый неповторяющийся символ

Формулировка: вернуть первый символ строки, который встречается ровно один раз. Если такого нет — вернуть пустой Optional или конкретное значение.

public Optional<Character> firstUnique(String s) {
    Map<Character, Integer> counts = new LinkedHashMap<>();
    for (char c : s.toCharArray()) {
        counts.merge(c, 1, Integer::sum);
    }
    return counts.entrySet().stream()
            .filter(e -> e.getValue() == 1)
            .map(Map.Entry::getKey)
            .findFirst();
}

ФИШКА. Почему LinkedHashMap, а не HashMap? LinkedHashMap сохраняет порядок вставки. Если использовать обычный HashMap — порядок ключей не гарантирован, и «первый» неповторяющийся символ может оказаться не тем, что в строке.

Задача 5. FizzBuzz

Формулировка: вывести числа от 1 до 100. Если число делится на 3 — вывести «Fizz». На 5 — «Buzz». На 15 — «FizzBuzz». Классика.

for (int i = 1; i <= 100; i++) {
    if (i % 15 == 0) System.out.println("FizzBuzz");
    else if (i % 3 == 0) System.out.println("Fizz");
    else if (i % 5 == 0) System.out.println("Buzz");
    else System.out.println(i);
}

Подвох: проверка % 15 должна идти ПЕРВОЙ. Если поставить её в конце — никогда не сработает.

Задача 6. Проверить, являются ли две строки анаграммами

Формулировка: две строки — анаграммы, если состоят из одного и того же набора символов. Например: «listen» и «silent».

public boolean isAnagram(String a, String b) {
    if (a == null || b == null || a.length() != b.length()) return false;
    char[] aChars = a.toLowerCase().toCharArray();
    char[] bChars = b.toLowerCase().toCharArray();
    Arrays.sort(aChars);
    Arrays.sort(bChars);
    return Arrays.equals(aChars, bChars);
}

Задача 7. Реализовать Singleton

Формулировка: напиши потокобезопасный синглтон. Расскажи, какие есть варианты.

Вариант 1: enum (рекомендуемый)

public enum Singleton {
    INSTANCE;

    public void doWork() {
        // ...
    }
}

Самый простой и безопасный способ. JVM гарантирует единственность экземпляра, есть защита от рефлексии и сериализации.

Вариант 2: static holder (lazy init)

public class Singleton {
    private Singleton() {}

    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}

Вариант 3: double-checked locking

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

ЛОВУШКА · Зачем volatile? Без volatile другой поток может увидеть «полусозданный» объект — JVM имеет право переупорядочить операции (выделение памяти → присвоение ссылки → вызов конструктора). Volatile запрещает такие reordering’и.

Задача 8. Простой REST-эндпоинт на Spring Boot

Формулировка: «Напиши контроллер, который возвращает список пользователей и позволяет добавить нового». Это часто просят сделать прямо во время собеса.

@RestController
@RequestMapping("/api/users")
public class UserController {

        private final UserService userService;

        public UserController(UserService userService) {
            this.userService = userService;
        }

        @GetMapping
        public List<UserDto> getAll() {
            return userService.findAll();
        }

        @GetMapping("/{id}")
        public UserDto getById(@PathVariable Long id) {
            return userService.findById(id);
        }

        @PostMapping
        @ResponseStatus(HttpStatus.CREATED)
        public UserDto create(@RequestBody @Valid CreateUserRequest request) {
            return userService.create(request);
        }
}

На что обратят внимание:

Задача 9. Code Review (могут попросить)

Тебе показывают кусок кода и просят найти проблемы. Пример:

public class UserCache {
    private static Map<Long, User> cache = new HashMap<>();

        public static User getUser(Long id) {
            if (cache.containsKey(id)) {
                return cache.get(id);
            }
            User user = loadFromDb(id);
            cache.put(id, user);
            return user;
        }
}

Что не так

Как должно быть

@Service
public class UserCache {
    private final Map<Long, User> cache = new ConcurrentHashMap<>();
    private final UserRepository repository;

        public UserCache(UserRepository repository) {
            this.repository = repository;
        }

        public Optional<User> getUser(Long id) {
            User cached = cache.computeIfAbsent(id,
                    key -> repository.findById(key).orElse(null));
            return Optional.ofNullable(cached);
        }
}

11. Pet-проект и self-presentation

ITK прямо требует наличие pet-проекта. Без него тебя «продать» клиенту почти невозможно. Это не просто «галочка» — это твоё портфолио.

Какой pet-проект подходит

СОВЕТ. Главное правило На собесе тебя про этот проект ОБЯЗАТЕЛЬНО спросят: что было сложно, почему выбрал такие технологии, что бы переделал сейчас. Готовь ответы заранее. Идеально — иметь пару архитектурных решений, которые ты можешь объяснить и обосновать.

Что спросят про твой опыт

12. План подготовки + чек-лист

За 2–3 недели до собеса

  1. Прорешать 30 простых задач на LeetCode (Easy) на строки, массивы, мапы. Без алгоритмов на графах — для джуна не нужно. 2. Перечитать главы по коллекциям и ООП в любой хорошей книге (Head First Java, или «Java для начинающих» Сьерра). 3. Поднять локально pet-проект на Spring Boot 3.x с PostgreSQL. Если уже есть — отрефакторить, добавить тесты. 4. Изучить базовые команды Docker и Git (на уровне «делал руками»).

За неделю

  1. Сделать 1–2 мок-собеса (друзья, ChatGPT в роли интервьюера, pramp.com). 6. Прорешать вопросы из этого гайда вслух — вслух, потому что мысли в голове и слова в речи — разные вещи. 7. Подготовить 2–3 истории про опыт по схеме: проблема → что сделал → результат. 8. Прочитать описание вакансии ITK ещё раз, выписать незнакомые слова — нагуглить.

В день собеса

ВНИМАНИЕ · Важно про аутстафф В ITK два уровня собеса. Если завалил у клиента — не катастрофа, тебя предложат другому проекту. Главное — пройти внутренний тех-собес и показать готовность учиться. Ментор в ITK заинтересован, чтобы ты вышел на проект.

Финальный чек-лист

Блок Готов, если можешь…
Java Core Объяснить ООП-принципы своими словами с примерами
Коллекции Рассказать, как устроен HashMap, и в чём разница с ArrayList/LinkedList
Исключения Различать checked и unchecked, объяснить try-with-resources
Многопоточность Назвать состояния потока и роль synchronized/volatile
Spring Написать REST-контроллер с DI через конструктор
Spring Boot Объяснить, что такое стартер и автоконфигурация
Docker Различить образ и контейнер, написать простой Dockerfile
SQL Написать запрос с GROUP BY и HAVING, объяснить ACID
Git Решить merge-конфликт и откатить коммит
OAuth Объяснить access/refresh token и зачем нужен Keycloak
Pet-проект Защитить свой проект 5 минут без подсказок

━━━━━━━━━━━━━━━━━━━━━━━━


Удачи на собесе!

// git push origin offer


Гайд из канала JavaJub — свежие разборы собесов выходят там первыми: @java_jub.

← Ко всем гайдам