Junior
Java-da obyektlərin müqayisəsi necə həyata keçirilir?
sobes.tech Süni İntellekt
AI-dan cavab
Java-da obyektlərin müqayisəsi müxtəlif üsullarla həyata keçirilir, dəqiq olaraq nə müqayisə edilməlidir: obyektlərin referansları və ya obyektlərin məzmunu.
-
Referansların müqayisəsi:
==operatoru: İki referansın eyni yaddaş obyektinə işarə etdiyini yoxlayır.
Object obj1 = new Object(); Object obj2 = new Object(); boolean areSameReference = (obj1 == obj2); // false, fərqli obyektlər Object obj3 = obj1; boolean areStillSameReference = (obj1 == obj3); // true, eyni obyektə referanslar -
Məzmunun müqayisəsi:
equals()metodu: Bu metodObjectsinfində təyin olunub və standart olaraq referansları müqayisə edir. Ancaq, sinflər bu metodu məzmun əsasında müqayisə etmək üçün yenidən təyin edə bilər. Məsələn,String,Integer, kolleksiyalar (ArrayList,HashMap)equalsmetodunu dəyərləri və ya elementləri müqayisə etmək üçün yenidən təyin edir.
String str1 = new String("hello"); String str2 = new String("hello"); boolean areEqualContent = str1.equals(str2); // true, məzmun eynidir boolean areSameReferenceString = (str1 == str2); // false, fərqli String obyektləri Integer int1 = 10; Integer int2 = 10; boolean areEqualIntegers = int1.equals(int2); // true boolean areSameReferenceInteger = (int1 == int2); // bu, Integer cache-ə bağlı olaraq true və ya false ola bilər, ancaq `equals` istifadə etmək daha yaxşıdırequals()metodunu yenidən təyin etdikdə,hashCode()metodunu da yenidən təyin etmək vacibdir, çünki: əgərobj1.equals(obj2)trueolarsa,obj1.hashCode()obj2.hashCode()-a bərabər olmalıdır. Əks halda, kontrakt pozulur: eyni hashCode-larequals()-ə görə bərabərliyi zəmanət etmir.
-
compareTo()və ya müqayisəçilər istifadə edilərək müqayisə:Comparableinterfeysi:compareTo(T other)metodunu təyin edir və öz sinfinin obyektlərinin digər obyektlərlə müqayisəsini təmin edir. Bu metod mənfi, sıfır və ya müsbət dəyər qaytarır, bu da obyektin digərindən kiçik, bərabər və ya böyük olduğunu göstərir.
public class MyObject implements Comparable<MyObject> { private int value; //... konstruktor və getterlər @Override public int compareTo(MyObject other) { return Integer.compare(this.value, other.value); } }Comparatorinterfeysi: Hər hansı obyekt üçün xüsusi müqayisə məntiqini təyin etməyə imkan verir, hətta onlarComparable-i həyata keçirməsələr belə. Bu, müxtəlif sıralama və ya müqayisə məntiqinə ehtiyac olduqda və ya orijinal sinfi dəyişdirmək mümkün olmadıqda faydalıdır.
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()); } }
Müqayisə metodunun seçimi konkret tapşırıqdan asılıdır: obyektlərin identifikasiyasını yoxlamaq üçün ==, məzmun bərabərliyini yoxlamaq üçün equals(), və sıralama və ya mürəkkəb müqayisələr üçün Comparable/Comparator istifadə edilir.