рдЬрд╛рд╡рд╛ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдлрд┐рд░ рд╕реЗ,
hashCode
рдФрд░
equals
рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫреЗрдВ? рдФрд░ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░рдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕реНрд╡рдпрдВ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдЧрд╛,
Object.hashCode()
рдФрд░
System.identityHashCode()
рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ? рдЗрди рддрд░реАрдХреЛрдВ рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИ? рдЙрдиреНрд╣реЗрдВ рд╣реЙрдЯрд╕реНрдкреЙрдЯ JVM рдореЗрдВ рдХреИрд╕реЗ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рд╣реА рдХреЛрдИ рд╕рд╣реА рдЬрд╡рд╛рдм рджреЗрдЧрд╛ред рдЬрдм рддрдХ, рдЬреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред
рдПрдХ рдЖрдо рдЧрд▓рддрдлрд╣рдореА рд╣реИ рдХрд┐
Object.hashCode
рдореЗрдореЛрд░реА рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкрддрд╛ рджреЗрддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рддреЛ рд╢рд╛рдпрдж рдРрд╕рд╛ рд╣реА рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Dalvik VM рдЕрднреА рднреА рджрд╛рдИрдВ рдУрд░ 3 рдмрд┐рдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрд╕рдлрд▓ рд╣реИ: рдкрд╣рд▓реЗ, рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╣реИрд╢ рдХреЛрдб рд╣реЛрдВрдЧреЗ; рджреВрд╕рд░реЗ, рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдЕрдкрдиреЗ рдкрддреЗ рдмрджрд▓рдХрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдореИрдВ рджреЛ рдмрд╛рд░ рд╣реИрд╢ рдХреЛрдб рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд╡рд┐рд╖рдп рдХреЗ рдЦрд┐рд▓рд╛рдл рдЖрдпрд╛, рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдПрдХ рдиреЛрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдмрд╣реБрдд рд╣реА рдЧрд▓рдд рд╡рд┐рдЪрд╛рд░ рд╡рд╛рд▓реА
рдЯрд┐рдкреНрдкрдгреА рдиреЗ рдореЗрд░реА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛ред рдпрд╣
SSSurkv рдерд╛
рдЬрд┐рд╕рдиреЗ рдХрд╛рдлреА рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдорд╛рдирд╛ рдХрд┐ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ
Object.hashCode
рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
- рддреЛ рдХреИрд╕реЗ? - рдЖрдк рдкреВрдЫреЗрдВред - рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЬреАрд╡рди рднрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╣реИрд╢ рдХреЛрдб рд╕реНрдерд┐рд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдмрд┐рд▓рдХреБрд▓ рдареАрдХред рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реИрд╢ рдХреЛрдб рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░
hashCode()
рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдмрд╛рдж рдХреЗ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЗрдбрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ!
OpenJDK рд╕реНрд░реЛрдд рдХреЛрдб (
get_next_hash
рдлрд╝рдВрдХреНрд╢рди) рдХреЛ
get_next_hash
рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВред
рдореИрдВ рд╢рд╛рдпрдж рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддрд╛ рдЕрдЧрд░ рджреВрд╕рд░реЗ рджрд┐рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ред рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд░рддреЗ рд╕рдордп, рд╕рдмрд╕реЗ рд╣реЙрдЯ рддрд░реАрдХреЛрдВ рдХреЗ рдмреАрдЪ, рдореИрдВрдиреЗ рдЕрдЪрд╛рдирдХ
IdentityHashMap.put()
рджреЗрдЦрд╛, рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХрд╛рдлреА рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдбрд╝рдЪрди
System.identityHashCode()
, рдЬреЛ IdentityHashMap рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХреЗрд╡рд▓ рдкрд╣рдЪрд╛рдирд╣реИрд╢рдХреЛрдб рдХреА рдкрд╣рд▓реА рдХреЙрд▓ рдзреАрдореА рдереАред рджреВрд╕рд░реА рдФрд░ рдмрд╛рдж рдХреА рдХреЙрд▓, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЕрдм рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╣реЗрдбрд░ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рд▓реЗрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЪрд╛рдВрджреА рдХреА рдкрд░рдд рдирд╣реАрдВ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдореЗрдВ рдЖрдк рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реНрд╡рд┐рдЪ
-XX:hashCode=n
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
Object.hashCode
рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
-XX:hashCode=n
(рдЬрд╣рд╛рдВ n 0 рд╕реЗ 5 рддрдХ рд╣реИ)ред
0 -
рдкрд╛рд░реНрдХ-рдорд┐рд▓рд░ RNG (рдбрд┐рдлрд╝реЙрд▓реНрдЯ)
1 - f (рдкрддрд╛, global_state)
2 - рдирд┐рд░рдВрддрд░ 1
3 - рд╕реАрд░рд┐рдпрд▓ рдХрд╛рдЙрдВрдЯрд░
4 - рд╡рд╕реНрддреБ рдкрддрд╛
5 - рдереНрд░реЗрдб-рд╕реНрдерд╛рдиреАрдп
рдЬрд╝реЛрд░реНрд╢рд┐рдлрд╝реНрдЯрдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд, рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╣реИ - рдпрд╣ рдХреЗрд╡рд▓ рдмрд┐рдЯ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рди рд╡рд┐рддрд░рдг рджреЗрддрд╛ рд╣реИ, рдФрд░, рдЬреЛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЛ рдирд╣реАрдВ рдЫреВрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╕рд┐рд░реНрдл JVM
-XX:hashCode=5
рдХреБрдВрдЬреА рдХреЛ рдЬреЛрдбрд╝рдиреЗ
-XX:hashCode=5
, рдореИрдВрдиреЗ рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ 30% рддрдХ рддреЗрдЬ рдХрд░ рджрд┐рдпрд╛ рд╣реИ! рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрднреА рддрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╣ рдПрдХ рд░рд╣рд╕реНрдп рдмрдирд╛ рд╣реБрдЖ рд╣реИ ...
рдЕрдВрдд рдореЗрдВ, рдПрдХ рдордЬрд╝реЗрджрд╛рд░ рддрдереНрдп: рд╣реЙрдЯрд╕реНрдкреЙрдЯ
hashCode
0 рдХрднреА рдирд╣реАрдВ рд▓реМрдЯреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ 0 рдХреЛ рдПрдХ рд╕рдВрдХреЗрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рдХреЛрдб рдЕрднреА рддрдХ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ:
if (value == 0) value = 0xBAD ;
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдм рдЬрдм рдЖрдкрдиреЗ
hashCode
рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рд╕рдЪреНрдЪрд╛рдИ рдЬрд╛рди рд▓реА рд╣реИ, рддреЛ рдЖрдк рди рдХреЗрд╡рд▓ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдЕрдкрдиреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЖрдкрдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдФрд░ рднреА рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред