Негізгі айырмашылық – Java тіліндегі хэшкодқа тең
Теңдіктер==операторына ұқсас, ол нысан теңдігін емес, нысан сәйкестігін тексеруге арналған. hashCode класс данасында сақталған деректерді 32 биттік қолтаңбалы бүтін сан болып табылатын бір хэш мәніне анық немесе айқын түрде бөлетін әдіс. Java тіліндегі тең мәндер мен hashCode арасындағы негізгі айырмашылық мынада: тең екі нысанды салыстыру үшін пайдаланылады, ал хэшкод нысанды қай топқа бөлу керектігін шешу үшін хэшингте қолданылады.
Java тіліндегі теңдік дегеніміз не?
Tengs әдісі екі нысанды салыстыру үшін пайдаланылады. Әдепкі тең әдіс нысан класында анықталған. Бұл іске асыру==операторына ұқсас. Екі нысан сілтемелері бір нысанға нұсқаған жағдайда ғана тең болады. Теңдеу әдісін қайта анықтауға болады.
01-сурет: Java бағдарламасы тең
System.out.println(s1.equals(s2)) операторы жалған жауап береді, себебі s1 және s2 екі түрлі нысанға сілтеме жасайды. Бұл System.out.println(s1==s2); мәлімдемесіне ұқсас болды.
System.out.println(s1.equals(s3)) мәлімдемесі дұрыс жауап береді, себебі s1 және s3 бір нысанға сілтеме жасайды. Бұл System.out.println(s1==s3); мәлімдемесіне ұқсас болды.
Студент сыныбында теңдік әдісі жоқ. Сондықтан Object класындағы теңдіктер шақырылады. "True" мәні тек нысан сілтемесі бір нысанға нұсқайтын болса ғана көрсетіледі.
02-сурет: Қайта анықталған Java бағдарламасы тең
Жоғарыдағы бағдарламаға сәйкес теңдік әдісі қайта анықталған. Нысан әдіске жіберіледі және ол Студентке шығарылады. Содан кейін id мәндері тексеріледі. Егер идентификатор мәндері ұқсас болса, ол шын мәнін қайтарады. Олай болмаса, ол жалғанды қайтарады. s1 және s2 идентификаторлары ұқсас. Осылайша, ол шындықты басып шығарады. s1 және s3 идентификаторлары да ұқсас, сондықтан ол шын деп басып шығарады.
Java тіліндегі хэшкод дегеніміз не?
Хэшкод нысанды қай топқа бөлу керектігін шешу үшін хэштеу кезінде пайдаланылады. Нысандар тобы бірдей хэшкодты ортақ пайдалана алады. Дұрыс хэштеу функциясы нысандарды әртүрлі топтарға біркелкі тарата алады.
Дұрыс хэшкод келесі сипаттарға ие болуы мүмкін.obj1 және obj2 сияқты екі нысан бар деп есептейік. Егер obj1.equals(obj2) шын болса, онда obj1.hashCode() obj2.hashCode() мәніне тең. Егер obj1.equals(obj2) жалған болса, obj1.hashCode() параметрінің obj2.hashCode() мәніне тең болмауы қажет емес. Екі бірдей емес нысанның хэшкоды бірдей болуы мүмкін.
03-сурет: тең және хэшкоды бар студент сыныбы
04-сурет: Негізгі бағдарлама
Студент сыныбы тең және hashCode әдістерін қамтиды. Студент класындағы теңдік әдісі нысанды алады. Егер нысан нөл болса, ол жалған мәнін қайтарады. Егер нысандардың сыныптары бірдей болмаса, ол жалған мәнін қайтарады. Идентификатор мәндері екі нысанда да тексеріледі. Егер олар ұқсас болса, ол шындыққа оралады. Әйтпесе ол "жалған" мәнін қайтарады.
Негізгі бағдарламада s1 және s2 нысандары жасалады. s1.equals(s2) шақыру кезінде true мәнін береді, себебі теңдік әдісі қайта анықталған және ол екі нысанның id мәндерін тексереді. Олар екі нысанға сілтеме жасаса да, жауап дұрыс, себебі s1 және s2 идентификатор мәндері бірдей. s1.equals(s2) шын болғандықтан, s1 және s2 хэшкоды тең болуы керек. s1 және s2 хэшкодын басып шығару бірдей мән береді. hashCode әдісін HashMap сияқты жинақтармен пайдалануға болады.
Java тіліндегі тең және хэш-кодтың айырмашылығы неде?
Java тіліндегі хэшкодқа тең |
|
equals – Java тіліндегі==операторына ұқсас әрекет ететін әдіс, ол нысан теңдігін емес, нысан сәйкестігін сынауға арналған. | хэшкод – класс данасында сақталған деректерді бір хэш мәніне жанама немесе айқын түрде бөлетін әдіс. |
Пайдалану | |
Tengs әдісі екі нысанды салыстыру үшін пайдаланылады. | Бұл әдіс нысанды қай топқа орналастыру керектігін шешу үшін хэштеуде қолданылады. |
Қорытынды – Java тіліндегі хэшкодқа тең
Java тіліндегі тең мәндер мен хэшкодтың айырмашылығы мынада: тең екі нысанды салыстыру үшін пайдаланылады, ал хэшкоды нысанды қай топқа бөлу керектігін шешу үшін хэшингте қолданылады.