Гол ялгаа – Java хэл дээрх hashCode-тэй тэнцүү
Тэнцүү нь==оператортой төстэй бөгөөд энэ нь объектын тэгш байдлыг бус объектын таних эсэхийг шалгах зорилготой юм. hashCode нь анги нь тухайн ангийн жишээнд хадгалагдсан өгөгдлийг 32 битийн тэмдэгтэй бүхэл тоо болох нэг хэш утга болгон задлах арга юм. Java хэл дээрх тэнцүү ба hashCode хоёрын гол ялгаа нь тэгш хэмийг хоёр объектыг харьцуулахад ашигладаг бол hashCode нь объектыг аль бүлэгт ангилахыг шийдэхэд ашиглагддаг.
Жава хэл дээр юу тэнцүү вэ?
2 объектыг харьцуулахдаа тэнцүү аргыг ашигладаг. Default equals аргыг объектын ангид тодорхойлсон. Энэ хэрэгжилт нь==оператортой төстэй. Хоёр объектын лавлагаа нь ижил объект руу чиглэж байгаа тохиолдолд л тэнцүү байна. Энэ нь тэнцүү аргыг хүчингүй болгох боломжтой.
Зураг 01: Тэнцүүтэй Java програм
S1 болон s2 нь хоёр өөр объектыг хэлж байгаа тул System.out.println(s1.equals(s2)) мэдэгдэл худал хариулт өгнө. Энэ нь System.out.println(s1==s2); мэдэгдэлтэй төстэй байсан.
S1 болон s3 нь ижил объектыг хэлж байгаа тул System.out.println(s1.equals(s3)) мэдэгдэл үнэн гэж хариулна. Энэ нь System.out.println(s1==s3); мэдэгдэлтэй төстэй байсан.
Оюутны ангид тэнцүүлэх арга байхгүй. Тиймээс Object анги дахь тэнцүүг дууддаг. Зөвхөн объектын лавлагаа ижил объект руу чиглэж байгаа тохиолдолд үнэнийг харуулна.
Зураг 02: Дарагдсан Java программ нь тэнцүү
Дээрх программын дагуу тэнцүүлэх аргыг хүчингүй болгосон. Объектыг арга руу дамжуулж, Оюутны төрөлд шилжүүлдэг. Дараа нь id утгуудыг шалгана. Хэрэв id утгууд нь ойролцоо байвал үнэн гэж буцна. Үгүй бол худал гэж буцна. s1 ба s2-ийн id ижил байна. Тиймээс энэ нь үнэн хэвлэх болно. s1 болон s3-н id-ууд нь адилхан тул үнэн гэж хэвлэнэ.
Java хэл дээр hashCode гэж юу вэ?
Хэшкод нь объектыг аль бүлэгт ангилахыг хэш болгоход ашигладаг. Бүлэг объектууд ижил hashCode-г хуваалцаж болно. Зөв хэшлэх функц нь объектуудыг өөр өөр бүлэгт жигд хуваарилах боломжтой.
Зөв hashCode нь дараах шинж чанартай байж болно. Obj1 ба obj2 гэсэн хоёр объект байна гэж бодъё. Хэрэв obj1.equals(obj2) үнэн бол obj1.hashCode() нь obj2.hashCode()-тай тэнцүү байна. Хэрэв obj1.equals(obj2) худал бол obj1.hashCode() нь obj2.hashCode()-тай тэнцүү биш байх албагүй. Хоёр тэгш бус объект нь ижил hashCode-тэй байж болно.
Зураг 03: Тэнцүү тоо болон hashCode-тэй оюутны анги
Зураг 04: Үндсэн програм
Student анги нь тэнцүү болон hashCode аргуудыг агуулдаг. Student анги дахь тэнцүү арга нь объектыг хүлээн авах болно. Хэрэв объект хоосон байвал худал буцаана. Хэрэв объектын ангилал ижил биш бол энэ нь худал буцаана. Хоёр объектод id утгыг шалгана. Хэрэв тэдгээр нь ижил төстэй байвал энэ нь үнэн болно. Үгүй бол энэ нь худал буцаана.
Үндсэн программ дээр s1 болон s2 объектууд үүсгэгддэг. s1.equals(s2)-г дуудах үед тэнцүү арга нь дарагдсан бөгөөд хоёр объектын id утгыг шалгадаг тул үнэнийг өгнө. Хэдийгээр тэд хоёр объектыг хэлж байгаа ч s1 ба s2-ийн id утгууд ижил учраас хариулт нь үнэн юм. s1.equals(s2) үнэн тул s1 ба s2-ийн hashCode нь тэнцүү байх ёстой. s1 ба s2-ийн hashCode-г хэвлэх нь ижил утгыг өгнө. HashCode аргыг HashMap зэрэг цуглуулгад ашиглаж болно.
Жава дахь тэнцүү ба hashCode хоёрын ялгаа юу вэ?
Java дахь hashCode-тэй тэнцүү байна |
|
equals нь Java хэл дээрх==оператортой төстэй арга бөгөөд энэ нь объектын тэгш байдлыг бус объектын таних эсэхийг шалгах явдал юм. | hashCode нь анги нь тухайн ангийн жишээнд хадгалагдсан өгөгдлийг нэг хэш утга болгон задлах арга юм. |
Хэрэглээ | |
2 объектыг харьцуулахдаа тэнцүү аргыг ашигладаг. | Объектыг аль бүлэгт оруулахыг шийдэхийн тулд хэш хийх аргыг ашигладаг. |
Хураангуй – Java хэл дээрх hashCode-тэй тэнцүү
Java хэл дээрх тэнцүү ба hashCode-ын ялгаа нь тэгш хэмийг хоёр объектыг харьцуулахад ашигладаг бол hashCode нь объектыг аль бүлэгт ангилахыг шийдэхэд ашигладаг.