Sobes.tech
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.

  1. 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
    
  2. Məzmunun müqayisəsi:

    • equals() metodu: Bu metod Object sinfində 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) equals metodunu 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ır
    
    • equals() metodunu yenidən təyin etdikdə, hashCode() metodunu da yenidən təyin etmək vacibdir, çünki: əgər obj1.equals(obj2) true olarsa, obj1.hashCode() obj2.hashCode()-a bərabər olmalıdır. Əks halda, kontrakt pozulur: eyni hashCode-lar equals()-ə görə bərabərliyi zəmanət etmir.
  3. compareTo() və ya müqayisəçilər istifadə edilərək müqayisə:

    • Comparable interfeysi: 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);
        }
    }
    
    • Comparator interfeysi: Hər hansı obyekt üçün xüsusi müqayisə məntiqini təyin etməyə imkan verir, hətta onlar Comparable-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.