Ինչպես է կատարվում օբյեկտների համեմատությունը Java-ում?
sobes.tech AI
Պատասխան AI-ից
Java-յում օբյեկտների համեմատությունը իրականացվում է մի քանի եղանակով, կախված նրանից, թե ինչն է պետք համեմատել՝ հղումները օբյեկտներին կամ օբյեկտների պարունակությունը:
-
Հղումների համեմատություն:
==օպերատորը՝ ստուգում է, արդյոք երկու հղումները ցույց են տալիս նույն օբյեկտին հիշողության մեջ:
Object obj1 = new Object(); Object obj2 = new Object(); boolean areSameReference = (obj1 == obj2); // false, տարբեր օբյեկտներ Object obj3 = obj1; boolean areStillSameReference = (obj1 == obj3); // true, նույն օբյեկտի հղումներ -
Պարունակության համեմատություն:
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()-ի համաձայն:
-
Համեմատություն
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՝ կարգավորման կամ բարդ համեմատությունների համար։