Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 626новых вакансий за сутки·54 602вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 579
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 395 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 901
  • Облачные технологии6 631
  • QA вакансии2 183
  • Android1 324
  • Инженер данных860
  • Продакт-менеджер316

Разработка

  • iOS1 240
  • Backend вакансии1 212
  • AI вакансии553
  • Fullstack вакансии503
  • Frontend вакансии428
  • Mobile вакансии28

По стеку

  • Go5 300
  • Java3 171
  • Kotlin1 128
  • Node.js1 016
  • Rust862
  • .NET676
  • PHP321
  • C++273
  • C#208

DevOps и инфраструктура

  • Kubernetes3 882
  • Linux-инфраструктура2 817
  • DevOps вакансии2 705
  • Terraform / IaC2 191
  • Мониторинг и Observability1 071
  • CI/CD920
  • SRE308
  • Кибербезопасность38

Аналитика и данные

  • Аналитик данных522
  • Data Scientist435
  • Бизнес-аналитик397
  • Системный аналитик67

Другие направления

  • Проджект-менеджер109
  • UI/UX дизайн67
  • Ручное тестирование14

По регионам

  • Вакансии в США25 642
  • Вакансии в Европе10 259
  • Работа в России3 639
  • Вакансии в Канаде2 255

По формату

  • Удалённые вакансии42 339
  • Релокация в США25 642
  • Гибридная работа5 706
  • Офисная работа4 402

По уровню

  • Senior вакансии22 510
  • Middle вакансии11 429
  • Junior вакансии3 877

Сейчас нанимают

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме JavaВсе вопросы
JavaJuniorТеория

В чём разница между Comparable и Comparator?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Comparable определяет естественный порядок внутри класса (compareTo), Comparator — внешний порядок, передаваемый в коллекции и сортировку. Comparator можно составлять через comparing/thenComparing без изменения класса.

Контракты интерфейсов

// Comparable — естественный порядок, живёт ВНУТРИ класса
public interface Comparable<T> {
    int compareTo(T other);  // <0, 0, >0
}

// Comparator — внешний порядок, НЕЗАВИСИМ от класса
@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
}

Comparable: реализация внутри класса

public final class Version implements Comparable<Version> {
    private final int major, minor, patch;

    public Version(int major, int minor, int patch) {
        this.major = major;
        this.minor = minor;
        this.patch = patch;
    }

    @Override
    public int compareTo(Version other) {
        // Integer.compare безопаснее, чем вычитание (нет overflow)
        int c = Integer.compare(this.major, other.major);
        if (c != 0) return c;
        c = Integer.compare(this.minor, other.minor);
        if (c != 0) return c;
        return Integer.compare(this.patch, other.patch);
    }

    @Override
    public boolean equals(Object o) { /* … */ }
    @Override
    public int hashCode() { /* … */ }
}

// Работает сразу с TreeSet, Collections.sort, Arrays.sort
TreeSet<Version> versions = new TreeSet<>();
versions.add(new Version(2, 0, 0));
versions.add(new Version(1, 9, 3));
System.out.println(versions.first()); // 1.9.3

Comparator: внешний, составной порядок

record Employee(String name, String department, int salary) {}

List<Employee> staff = List.of(
    new Employee("Alice", "Engineering", 120_000),
    new Employee("Bob",   "Engineering",  95_000),
    new Employee("Carol", "Marketing",   100_000)
);

// Сортировка: сначала по отделу, потом по зарплате убывающей
Comparator<Employee> comp = Comparator
    .comparing(Employee::department)
    .thenComparing(Comparator.comparingInt(Employee::salary).reversed());

List<Employee> sorted = staff.stream()
    .sorted(comp)
    .toList();
// Engineering: Alice(120k), Bob(95k)  →  Marketing: Carol(100k)

Nulls и локализация

// Работа с null-значениями
Comparator<String> nullSafe = Comparator.nullsLast(
    Comparator.naturalOrder()
);

// Локализованная сортировка строк
Collator ruCollator = Collator.getInstance(Locale.forLanguageTag("ru"));
Comparator<String> ruComp = ruCollator::compare;

List<String> names = new ArrayList<>(List.of("Яков", "Андрей", "Борис"));
names.sort(ruComp);
System.out.println(names); // [Андрей, Борис, Яков]

Контракт: согласованность с equals

// ВАЖНО: если a.compareTo(b) == 0, желательно a.equals(b) == true
// TreeMap и TreeSet используют compareTo/compare для проверки равенства,
// а не equals!
TreeMap<Version, String> map = new TreeMap<>();
map.put(new Version(1, 0, 0), "stable");
// map.get(new Version(1, 0, 0)) работает через compareTo, не equals

Когда что использовать

  • Comparable — есть единственный очевидный «естественный» порядок (числа, даты, версии, строки).
  • Comparator — нужно несколько порядков, класс чужой (String, LocalDate), или порядок зависит от контекста (локаль, роль пользователя).

Подводные камни

  • Вычитание вместо Integer.compare. return a - b даёт integer overflow при a=Integer.MAX_VALUE, b=-1; всегда используйте Integer.compare(a, b).
  • TreeMap/TreeSet игнорируют equals. Два объекта с compareTo==0 считаются одним ключом, даже если equals возвращает false — потеря данных без предупреждения.
  • Нарушение транзитивности. Если comp.compare(a,b)>0 и comp.compare(b,c)>0, то comp.compare(a,c) обязан быть >0; нарушение контракта делает поведение сортировки неопределённым (JDK бросает IllegalArgumentException в TimSort начиная с Java 7).
  • Comparator.reversed() и null. naturalOrder().reversed() не обрабатывает null; оборачивайте в nullsFirst/nullsLast до reversed().
  • Comparator как лямбда не сериализуем. Если Comparator передаётся в Serializable-коллекцию (например, TreeMap в сессии), лямбда выбросит NotSerializableException.
  • comparing() использует equals для boxing. Comparator.comparingInt лучше чем comparing(e -> e.salary()) для примитивов — избегает автобоксинга при каждом сравнении.
  • Изменяемое поле в Comparable. Если поле, по которому сравниваете, изменяется после вставки в TreeSet/TreeMap, объект «теряется» в структуре — не найти ни get, ни contains.
  • Несовместимость Comparable с subclassing. Добавление поля в подкласс и расширение compareTo нарушает симметрию с суперклассом; предпочитайте composition over inheritance для value objects.

Типичные ошибки

  • Путать термин «comparable comparator» с соседним механизмом Java.
  • Не называть границу lifecycle, transaction, thread или request для «comparable comparator».
  • Игнорировать production-эффекты «comparable comparator»: latency, SQL shape, memory, security или observability.

Что проверяет интервьюер

  • Попросить объяснить механизм «comparable comparator» на минимальном примере.
  • Проверить, видит ли кандидат failure mode и диагностику для «comparable comparator».
  • Уточнить, какие настройки или API меняют «comparable comparator» в реальном сервисе.

Как вы знаете этот вопрос?

Проверить себя по теме Java →

Источники

  • https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/HashMap.html
←Предыдущий вопросОбъясните различия между абстрактными классами и интерфейсами в Java 17+.Следующий вопрос→В чём разница между checked и unchecked исключениями?

Связанные темы

Javabackend-designtechnical-communication

Вакансии с этим навыком

Java вакансии
  • AI Enablement Lead (GenAI Value Lab) (#5686)
  • Senior Full Stack Mobile Developer (#5704)
  • Middle General QA Engineer (#5796)
  • Full-stack Technical Lead (Java+React) (#5710)
  • Lead Application Security Engineer

Частые вопросы на собеседовании

  • Как работает сборка мусора в Java? Объясните G1GC, ZGC и Shenandoah.
  • Как работает модель памяти Java? В чём разница между heap и stack?
  • Объясните Java Memory Model (JMM) и концепцию happens-before.
  • Что такое virtual threads (Project Loom) и чем они отличаются от platform threads?