Junior
Kaip Java kalba atliekamas objektų palyginimas?
sobes.tech AI
Atsakymas iš AI
Java kalboje objektų palyginimas atliekamas keliais būdais, priklausomai nuo to, ką tiksliai reikia palyginti: nuorodas į objektus ar objekto turinį.
-
Nuorodų palyginimas:
- Operatorius
==: Patikrina, ar dvi nuorodos nurodo tą patį objektą atmintyje.
Object obj1 = new Object(); Object obj2 = new Object(); boolean areSameReference = (obj1 == obj2); // false, skirtingi objektai Object obj3 = obj1; boolean areStillSameReference = (obj1 == obj3); // true, nuorodos į tą patį objektą - Operatorius
-
Turinio palyginimas:
equals()metodas: Šis metodas yra apibrėžtasObjectklasėje ir pagal numatytuosius nustatymus lygina nuorodas. Tačiau, klasės gali perrašyti šį metodą, kad įgyvendintų turinio palyginimą. Pavyzdžiui,String,Integer, kolekcijos (ArrayList,HashMap) perrašoequalsmetodą, kad palygintų reikšmes ar elementus.
String str1 = new String("hello"); String str2 = new String("hello"); boolean areEqualContent = str1.equals(str2); // true, turinys yra vienodas boolean areSameReferenceString = (str1 == str2); // false, skirtingi objektai Integer int1 = 10; Integer int2 = 10; boolean areEqualIntegers = int1.equals(int2); // true boolean areSameReferenceInteger = (int1 == int2); // gali būti true arba false, priklausomai nuo Integer kešo, bet geriau naudoti `equals`- Kai perrašote
equals()metodą, būtina taip pat perrašytihashCode()metodą, kad būtų išlaikytas kontraktas: Jeiobj1.equals(obj2)grąžinatrue, tadaobj1.hashCode()turi būti lygusobj2.hashCode(). Atvirkščiai, vienodi hash kodai nereiškia, kad objektai yra lygūs pagalequals().
-
Palyginimas naudojant
compareTo()arba palyginimo priemones:Comparablesąsaja: Apibrėžia metodącompareTo(T other), kuris leidžia objektams savo klasės objektus palyginti su kitais tos pačios klasės objektais. Grąžina neigiamą, nulio arba teigiamą reikšmę, nurodančią, ar objektas yra mažesnis, lygus ar didesnis už nurodytą objektą.
public class MyObject implements Comparable<MyObject> { private int value; //... konstruktorius ir getteriai @Override public int compareTo(MyObject other) { return Integer.compare(this.value, other.value); } }Comparatorsąsaja: Leidžia apibrėžti naudotojo logiką bet kokiems objektams, net jei jie neįgyvendinaComparable. Tai naudinga, kai reikia skirtingos rūšiavimo ar palyginimo logikos vienai klasei arba kai negalima keisti pirminės klasės.
import java.util.Comparator; public class MyObjectValueComparator implements Comparator<MyObject> { @Override public int compare(MyObject obj1, MyObject obj2) { return Integer.compare(obj1.getValue(), obj2.getValue()); } }
Pasirinkimas priklauso nuo konkrečios užduoties: == naudojamas objektų tapatumo patikrinimui, equals() – turinio lygybės patikrinimui, o Comparable/Comparator – tvarkos nustatymui arba sudėtingesniems palyginimams.