Obecně se operátory „==“ i „equals()“ v Javě používají k porovnávání objektů a kontrole rovnosti, ale zde jsou uvedeny některé rozdíly mezi nimi:
- Hlavní rozdíl mezi metodou .equals() a operátorem == je ten, že jedno je metoda a druhé operátor.
- Operátor == můžeme použít pro porovnání odkazů (porovnání adres) a metodu .equals() pro porovnání obsahu. Zjednodušeně řečeno, == kontroluje, zda oba objekty ukazují na stejné místo v paměti, zatímco .equals() vyhodnocuje porovnání hodnot v objektech.
- Pokud třída nepřepisuje metodu equals, pak standardně používá metodu equals(Object o) nejbližší nadřazené třídy, která tuto metodu přepsala. Podrobnosti naleznete zde
- Příklad kódování:
public
class
Test {
public
static
void
main(String args)
{
String s1 =
new
String(
"HELLO"
);
String s2 =
new
String(
"HELLO"
);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
Výstup:
falsetrue
Vysvětlení: Zde vytváříme dva objekty, a to s1 a s2.
- Obojí s1 a s2 odkazuje na různé objekty.
- Při použití operátoru == pro porovnání s1 a s2 je výsledek nepravdivý, protože oba mají v paměti různé adresy.
- Při použití rovnítka je výsledek pravdivý, protože porovnává pouze hodnoty uvedené v s1 a s2.
Pochopíme oba operátory podrobněji:
Operátor rovnosti(==)
Operátor rovnosti můžeme použít pro každý primitivní typ včetně typu boolean. operátor rovnosti můžeme použít i pro objektové typy.
class
Test {
public
static
void
main(String args)
{
System.out.println(
10
==
20
);
System.out.println(
'a'
==
'b'
);
System.out.println(
'a'
==
97.0
);
System.out.println(
true
==
true
);
}
}
Výstup:
falsefalsetruetrue
Pokud použijeme == pro typy objektů, pak by měla existovat kompatibilita mezi typy argumentů (buď dítě k rodiči, nebo rodič k dítěti, nebo stejný typ). V opačném případě dostaneme chybu při kompilaci.
class
Test {
public
static
void
main(String args)
{
Thread t =
new
Thread();
Object o =
new
Object();
String s =
new
String(
"GEEKS"
);
System.out.println(t == o);
System.out.println(o == s);
System.out.println(t==s);
}
}
Výstup:
falsefalse// error: incomparable types: Thread and String
.equals()
V Javě metoda string equals() porovnává dva zadané řetězce na základě údajů/obsahu řetězce. Pokud jsou všechny obsahy obou řetězců stejné, vrací hodnotu true. Pokud se všechny znaky neshodují, pak vrací false.
public
class
Test {
public
static
void
main(String args)
{
Thread t1 =
new
Thread();
Thread t2 =
new
Thread();
Thread t3 = t1;
String s1 =
new
String(
"GEEKS"
);
String s2 =
new
String(
"GEEKS"
);
System.out.println(t1 == t3);
System.out.println(t1 == t2);
System.out.println(s1 == s2);
System.out.println(t1.equals(t2));
System.out.println(s1.equals(s2));
}
}
Výstup:
truefalsefalsefalsetrue
Vysvětlení: Zde používáme metodu .equals ke kontrole, zda dva objekty obsahují stejná data nebo ne.
- V uvedeném příkladu vytváříme 3 objekty typu Thread a 2 objekty typu String.
- V prvním porovnání zjišťujeme, zda t1 == t3, nebo ne. Protože víme, že t1 i t3 ukazují na stejný objekt, proto se vrátí true.
- V druhém porovnání používáme operátor „==“ pro porovnání řetězcových objektů, nikoliv obsahu objektů. Zde se oba objekty liší, a proto je výsledek tohoto porovnání „False“
- Pokud porovnáváme 2 objekty String pomocí operátoru .equals(), pak kontrolujeme, zda oba objekty obsahují stejná data, nebo ne.
- Oba objekty obsahují stejný String, tedy GEEKS, proto se vrátí true.
Tento článek napsal Bishal Kumar Dubey. Pokud se vám GeeksforGeeks líbí a chtěli byste přispět, můžete také napsat článek pomocí stránky contribute.geeksforgeeks.org nebo poslat svůj článek na adresu [email protected]. Uvidíte, jak se váš článek objeví na hlavní stránce GeeksforGeeks, a pomůžete tak ostatním geekům.