Sobes.tech
Junior

Java'da obyektlarni qanday taqqoslash amalga oshiriladi?

sobes.tech AI

AIdan javob

Java'da obyektlarni taqqoslash bir necha usul bilan amalga oshiriladi, ayniqsa nima taqqoslanishi kerakligiga bog'liq: obyektlar referenslari yoki obyektlarning mazmuni.

  1. Referenslarni taqqoslash:

    • == operatori: Ikki referensning bir xil xotira obyektiga ishora qilayotganligini tekshiradi.
    Object obj1 = new Object();
    Object obj2 = new Object();
    boolean areSameReference = (obj1 == obj2); // false, turli obyektlar
    Object obj3 = obj1;
    boolean areStillSameReference = (obj1 == obj3); // true, bir xil obyektga referenslar
    
  2. Mazmuni bo'yicha taqqoslash:

    • equals() metodi: Bu metod Object sinfida ta'riflangan va standartda referenslarni taqqoslaydi. Ammo, sinflar bu metodni mazmuni bo'yicha taqqoslash uchun qayta yozishi mumkin. Masalan, String, Integer, kolleksiyalar (ArrayList, HashMap) equalsni qiymat yoki elementlarni taqqoslash uchun qayta yozadilar.
    String str1 = new String("hello");
    String str2 = new String("hello");
    boolean areEqualContent = str1.equals(str2); // true, mazmuni bir xil
    boolean areSameReferenceString = (str1 == str2); // false, turli String obyektlari
    
    Integer int1 = 10;
    Integer int2 = 10;
    boolean areEqualIntegers = int1.equals(int2); // true
    boolean areSameReferenceInteger = (int1 == int2); // bu, Integer cache'iga bog'liq holda true yoki false bo'lishi mumkin, lekin `equals`dan foydalanish yaxshiroq
    
    • equals() metodini qayta yozishda, hashCode() metodini ham qayta yozish shart, chunki: agar obj1.equals(obj2) true bo'lsa, obj1.hashCode() obj2.hashCode() ga teng bo'lishi kerak. Aks holda, kontrakt buziladi: bir xil hashCode'lar equals() bo'yicha tenglikni kafolatlamaydi.
  3. compareTo() yoki comparatorlar yordamida taqqoslash:

    • Comparable interfeysi: compareTo(T other) metodini ta'riflaydi va o'z sinfidagi obyektlarning boshqa obyektlar bilan taqqoslanishini imkonini beradi. Bu metod manfiy, nol yoki musbat qiymat qaytaradi, bu esa obyekt kichik, teng yoki katta ekanligini ko'rsatadi.
    public class MyObject implements Comparable<MyObject> {
        private int value;
    
        //... konstruktor va getterlar
    
        @Override
        public int compareTo(MyObject other) {
            return Integer.compare(this.value, other.value);
        }
    }
    
    • Comparator interfeysi: Har qanday obyekt uchun moslashtirilgan taqqoslash mantiqini aniqlash imkonini beradi, hatto ular Comparableni amalga oshirmagan bo'lsa ham. Bu, turli xil saralash yoki taqqoslash mantiqlari kerak bo'lsa yoki original sinfni o'zgartirish mumkin bo'lmagan hollarda foydalidir.
    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());
        }
    }
    

Taqqoslash usulini tanlash aniq vazifaga bog'liq: == obyektlarning identifikatsiyasini tekshirish uchun, equals() mazmuni tengligini tekshirish uchun, va Comparable/Comparator tartib yoki murakkab taqqoslashlarni amalga oshirish uchun.