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()-ին։ հակառակը չի գործում՝ նույն hash կոդերը չեն երաշխավորում օբյեկտների հավասարությունը equals()-ի համաձայն:
  3. Համեմատություն compareTo() կամ համեմատիչների միջոցով:

    • Comparable ինտերֆեյսը սահմանում է compareTo(T other) մեթոդը, որը թույլ է տալիս օբյեկտներին իրենց դասի մյուս օբյեկտների հետ համեմատել։ Վերադարձնում է բացասական, զրո կամ դրական թիվ՝ ցույց տալով, արդյոք օբյեկտը փոքր է, հավասար կամ մեծ՝ համեմատած մյուսի հետ:
    public class MyObject implements Comparable<MyObject> {
        private int value;
    
        //... կոնստրուկտոր և getter-ներ
    
        @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՝ կարգավորման կամ բարդ համեմատությունների համար։