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.
-
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 -
Mazmuni bo'yicha taqqoslash:
equals()metodi: Bu metodObjectsinfida 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 yaxshiroqequals()metodini qayta yozishda,hashCode()metodini ham qayta yozish shart, chunki: agarobj1.equals(obj2)truebo'lsa,obj1.hashCode()obj2.hashCode()ga teng bo'lishi kerak. Aks holda, kontrakt buziladi: bir xil hashCode'larequals()bo'yicha tenglikni kafolatlamaydi.
-
compareTo()yoki comparatorlar yordamida taqqoslash:Comparableinterfeysi: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); } }Comparatorinterfeysi: Har qanday obyekt uchun moslashtirilgan taqqoslash mantiqini aniqlash imkonini beradi, hatto ularComparableni 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.