Sobes.tech
Junior

Чӣ гуна муқоиса кардани объектҳо дар Java анҷом дода мешавад?

sobes.tech AI

Ҷавоб аз AI

Дар Java, муқоисаи объектҳо бо чанд роҳ анҷом дода мешавад, вобаста ба он, ки чӣ бояд муқоиса шавад: истинодҳо ба объектҳо ё мазмуни объектҳо.

  1. Муқоисаи истинодҳо:

    • Оператор ==: Санҷиш мекунад, ки оё ду истинод ба як объект дар ёддошт ишора мекунанд.
    Object obj1 = new Object();
    Object obj2 = new Object();
    boolean areSameReference = (obj1 == obj2); // false, объектҳои гуногун
    Object obj3 = obj1;
    boolean areStillSameReference = (obj1 == obj3); // true, истинодҳо ба як объект
    
  2. Муқоисаи мазмун:

    • Метод equals(): Ин метод дар класи Object муайян шудааст ва ба таври пешфарз истинодҳоро муқоиса мекунад. Аммо, кластаро метавонанд ин методро такрорбарӣ кунанд, то логикаи муқоисаи мазмунро амалӣ созанд. Масалан, String, Integer, коллеҷҳо (монанди ArrayList, HashMap) equals-ро барои муқоисаи арзишҳо ё унсурҳо такрорбарӣ мекунанд.
    String str1 = new String("hello");
    String str2 = new String("hello");
    boolean areEqualContent = str1.equals(str2); // true, мазмун яксон аст
    boolean areSameReferenceString = (str1 == str2); // false, объектҳои гуногун
    
    Integer int1 = 10;
    Integer int2 = 10;
    boolean areEqualIntegers = int1.equals(int2); // true
    boolean areSameReferenceInteger = (int1 == int2); // метавонад true ё false бошад, вобаста ба кеши Integer, аммо истифодаи `equals` беҳтар аст
    
    • Вақте ки метод equals() такрорбарӣ мешавад, ҳатман бояд hashCode()-и онро ҳам такрорбарӣ кард, то шартҳои шартнома риоя шаванд: Агар obj1.equals(obj2) true бошад, пас obj1.hashCode() бояд баробар бо obj2.hashCode() бошад. Қайд кардан лозим аст, ки баробар кодҳои хеш наметавонанд кафолат диҳанд, ки объектҳо баробар мебошанд.
  3. Муқоисаи бо истифода аз compareTo() ё муқоисакунандагон:

    • Интерфейси Comparable: Метод compareTo(T other)-ро муайян мекунад, ки имкон медиҳад, ки объектҳои класи худ бо дигар объектҳои ҳамин класи муқоиса шаванд. Вай арзиши манфӣ, нулӣ ё мусбатро бармегардонад, ки нишон медиҳад, ки оё объекти ҳозира хурдтар, баробар ё калонтар аз объекти дода шудааст.
    public class MyObject implements Comparable<MyObject> {
        private int value;
    
        //... конструктор ва геттерҳо
    
        @Override
        public int compareTo(MyObject other) {
            return Integer.compare(this.value, other.value);
        }
    }
    
    • Интерфейси Comparator: Имкон медиҳад, ки логикаи махсуси муқоиса барои ҳар гуна объектҳо муайян карда шавад, ҳатто агар онҳо Comparable-ро иҷро накунанд. Ин кӯмак мекунад, вақте ки лозим аст, логикаи гуногуни сортинг ё муқоиса барои як класи муайян, ё вақте ки тағир додани класи асосӣ имконнопазир аст.
    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());
        }
    }
    

Намуди муқоиса интихоб кардан ба вазифаи мушаххас вобаста аст: == барои санҷиши ҳуввияти объектҳо, equals() барои санҷиши баробарии мазмун ва Comparable/Comparator барои муайян кардани тартиб ё иҷрои муқоисаҳои мураккаб.