Objects.compare în Java

Compară două obiecte cu un Comparator dat; returnează 0 imediat dacă sunt același obiect (inclusiv ambele null).

Sintaxă
static <T> int compare(T a, T b, Comparator<? super T> c)

Ce face Objects.compare

Objects.compare(a, b, comparator) returnează 0 dacă a == b (același obiect sau ambele null) și comparator.compare(a, b) în rest. Rezultatul are sensul obișnuit: negativ dacă a vine înainte, pozitiv dacă vine după.

Metoda nu tratează singură cazul în care doar unul este null: decizia rămâne la comparator. Dacă valorile pot lipsi, folosește un comparator ca Comparator.nullsFirst(...) sau nullsLast(...).

Parametri

Parametru Descriere
a, b Obiectele comparate.
c Comparatorul folosit.

Ce returnează

Un int: negativ, 0 sau pozitiv.

Exemple

Exemplul 1: Comparare cu ordine naturală și inversă

import java.util.Comparator;
import java.util.Objects;

public class Main {
    public static void main(String[] args) {
        System.out.println(Objects.compare("Ana", "Ion", Comparator.naturalOrder()));
        System.out.println(Objects.compare("Ana", "Ion", Comparator.reverseOrder()));
        System.out.println(Objects.compare(null, null, Comparator.<String>naturalOrder()));
    }
}

Rezultat

-8
8
0

Exemplul 2: Valori care pot lipsi

Cu nullsLast, un oraș necunoscut ajunge după cele cunoscute.

import java.util.Comparator;
import java.util.Objects;

public class Main {
    public static void main(String[] args) {
        Comparator<String> cmp = Comparator.nullsLast(Comparator.naturalOrder());
        String[][] perechi = {{"Iași", "Cluj"}, {null, "Arad"}, {"Arad", null}};
        for (String[] p : perechi) {
            System.out.println(p[0] + " vs " + p[1] + ": " + Objects.compare(p[0], p[1], cmp));
        }
    }
}

Rezultat

Iași vs Cluj: 6
null vs Arad: 1
Arad vs null: -1

Greșeli frecvente

  • Crezi că Objects.compare te protejează de null ca Objects.equals: dacă doar unul este null și comparatorul nu îl tratează, primești NullPointerException.

Comenzi înrudite

  • Comparatori (Comparable și Comparator): Comparable dă ordinea naturală a unei clase (compareTo); Comparator descrie orice altă ordine și se combină cu comparing, thenComparing și reversed.
  • Integer.compare: compare() compară două int-uri (negativ, 0, pozitiv); max, min și sum sunt variante scurte pentru referințe la metode.
  • String.compareTo: Compară două șiruri în ordine lexicografică: rezultat negativ, zero sau pozitiv; variante fără litere mari/mici.
  • Objects: Clasa java.util.Objects are metode statice care lucrează sigur cu null; equals() compară două obiecte care pot fi null.