
рдкреБрд░рд╛рдиреЗ рд╕рдордп рд╕реЗ, рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рдЕрджреНрднреБрдд
рдореИрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ,
рд╣реИрд╢рдкреЙрдк рд╣реИ ред рдФрд░ рдЬрд╛рд╡рд╛ 5 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░,
рд╕рдорд╡рд░реНрддреА рд╣рд╛рд╢рдкрд╛ рднреА рд╣реИред рдЗрди рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЙрдирдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдХреНрдпрд╛ рдЗрд╕ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЕрд╕рдВрдЧрдд рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдЪреЗрддрд╛рд╡рдиреА: рдпрд╣ рдЖрд▓реЗрдЦ OpenJDK 8 рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдЙрджреНрдзрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ GNU рдЬрдирд░рд▓ рдкрдмреНрд▓рд┐рдХ рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╕рдВрд╕реНрдХрд░рдг 2 рдХреЗ рддрд╣рдд рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЯрд╛рдЗрдореНрд╕ 8 рд╕реЗ рдкрд╣рд▓реЗ
рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рд▓рдВрдмреЗ, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдордп рдкрд╣рд▓реЗ рдЬрд╛рд╡рд╛ 7, рдФрд░ рдлрд┐рд░ рдЬрд╛рд╡рд╛ 8 (рдЕрдм рдХреА рддрд░рд╣ рдирд╣реАрдВ, рд╣рд░ рдЫрд╣ рдорд╣реАрдиреЗ рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг) рдкрд╛рдпрд╛, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдореИрдк рдХреЗ рд╕рд╛рде рдХреМрди рд╕реЗ рдСрдкрд░реЗрд╢рди рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдереЗред рдпрд╣ рд╣реИ:
рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ рдорд╛рди рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдореМрдЬреВрджрд╛ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрд▓рд╕реА рдЖрд░рдВрднреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдлрд┐рд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдХреЛрдб рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛:
String getOrPut(String key) { String result = map.get(key);
- рд╣рдореЗрдВ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдореВрд▓реНрдп рдорд┐рд▓рддрд╛ рд╣реИ
- рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди рдкрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
- рдпрджрд┐ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрдирд╛рдПрдВ
- рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗрдВ
рдпрд╣ рдереЛрдбрд╝рд╛ рдмреЛрдЭрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╣реИрд╢рдкреЙрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рд┐рд░реНрдл рдХреЛрдб рд╣реИ рдЬреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдкрд┐рд░реЛрдпрд╛ рд╣реБрдЖ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдорд╡рд░реНрддреА рд╣рд╛рд╢рдк рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлреАрдЪрд░ рдкреЙрдк рдЕрдк рдХрд░рддрд╛ рд╣реИ: рдХреНрд░рд┐рдПрдЯрд╡реИрд▓реНрдпреВ (2) рд╡рд┐рдзрд┐ рдХреЛ рдХрдИ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдХрдИ рдереНрд░реЗрдб рд╕реНрдерд┐рддрд┐ (1) рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдорд╛рди рд▓рд┐рдЦрддрд╛ рд╣реИ (3)ред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдЕрдХреНрд╕рд░ рдЕрд╡рд╛рдВрдЫрдиреАрдп рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрд╛рд╡рд╛ 8 рд╕реЗ рдкрд╣рд▓реЗ, рдмрд╕ рдХреЛрдИ рд╕реБрдВрджрд░ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдереЗред рдпрджрд┐ рдЖрдкрдХреЛ рдХрдИ рдореВрд▓реНрдп рд╕реГрдЬрди рдХреЛ рдЪрдХрдорд╛ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЬрд╛рд╡рд╛ 8 рдиреЗ рдЪреАрдЬреЛрдВ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рджрд┐рдпрд╛ред рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ ...
рдЬрд╛рд╡рд╛ 8 рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ ...
рд╕рдмрд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдЬрд╛рд╡рд╛ 8 рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдИ рд╣реИ? рдпрд╣ рд╕рд╣реА рд╣реИ, рд▓рдВрдмреЛрджрд░ред рдФрд░ рди рдХреЗрд╡рд▓ рд▓рд╛рдорд╛, рдмрд▓реНрдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдкреАрдЖрдИ рдореЗрдВ рдЙрдирдХрд╛ рд╕рдорд░реНрдердиред рдорд╛рдирдЪрд┐рддреНрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реАрдХреЗ рджрд┐рдЦрд╛рдИ рджрд┐рдП:
рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг, рдкрд╣рд▓реЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
String getOrPut(String key) { return map.computeIfAbsent(key, this::createValue); }
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдорд╡рд░реНрддреА
HashMap рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ,
computeIfAbsent рд╡рд┐рдзрд┐ рднреА рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИред рдпрд╛рдиреА createValue рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛред
рдЖрдИрдбреАрдИ рднреА рдкрд╛рд╕ рдирд╣реАрдВ рд╣реБрдЖред рдЗрд╕рд▓рд┐рдП рдЗрдВрдЯреЗрд▓реАрдЬ рдЖрдИрдбреАрдИрдП рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдСрдЯреЛ-рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИ:
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреЛрдб рд╕рд░рд▓реАрдХрд░рдг рдФрд░ рдЖрдИрдбреАрдИ рд╕рдВрдХреЗрдд рджреЛрдиреЛрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрд╕ рдирдП рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рдХрдореНрдкреНрдпреВрдЯрд░реАрдЯ рдПрдмреНрд╕реЗрдВрдЯ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧрд╛ред
рдмрд╛рдп ...
рдЕрдЪрд╛рдирдХ!
рдЬрдм рддрдХ рдЕрдЧрд▓реА рд▓реЛрдб рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдЖ рдЬрд╛рддрд╛ред рдФрд░ рдлрд┐рд░ рдПрдХ рднрдпрд╛рдирдХ рдмрд╛рдд рд╕рд╛рдордиреЗ рдЖрдИ:

рдЬрд╛рд╡рд╛ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛:
Openjdk рд╕рдВрд╕реНрдХрд░рдг "1.8.0_222"
OpenJDK рд░рдирдЯрд╛рдЗрдо рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ (рдмрд┐рд▓реНрдб 1.8.0_222-8u222-b10-1ubuntu1 ~ 18.04.1-b10)
OpenJDK 64-рдмрд┐рдЯ рд╕рд░реНрд╡рд░ VM (рдмрд┐рд▓реНрдб 25.222-b10, рдорд┐рд╢реНрд░рд┐рдд рдореЛрдб)
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ
YourKit рдЬреИрд╕реЗ рдЕрджреНрднреБрдд рдЙрдкрдХрд░рдг рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВред
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ, рдХреНрд╖реИрддрд┐рдЬ рд╡рд┐рд╕реНрддреГрдд рд▓рд╛рдЗрдиреЗрдВ рд╕рдордп рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рджрд┐рдЦрд╛рддреА рд╣реИрдВред рд╕рдордп рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреНрд╖рдг рдореЗрдВ рдзрд╛рд░рд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдкрдЯреНрдЯреА рдХреЛ рдЗрд╕реА рд░рдВрдЧ рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рдкреАрд▓рд╛ - рдзрд╛рд░рд╛ рдмреЗрдХрд╛рд░ рд╣реИ, рдХрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ;
- рд╣рд░рд╛ - рдзрд╛рдЧрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ;
- рд▓рд╛рд▓ - рдпрд╣ рдзрд╛рдЧрд╛ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рд╕реЗ рдЕрд╡рд░реБрджреНрдз рд╣реЛрддрд╛ рд╣реИред
рдпрд╣реА рд╣реИ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд▓рдЧрднрдЧ рд╕рднреА рдереНрд░реЗрдбреНрд╕ (рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдереЗ) рдЕрд╡рд░реБрджреНрдз рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рдЧрднрдЧ рд╣рд░ рд╕рдордп рд╣реИрдВред рдФрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП, рддрд╛рд▓рд╛ рдПрдХ рд╣реА рдХрдореНрдкреНрдпреВрдЯрд░реАрдпрд░ рдореЗрдВ рд╣реИ рд╕рдорд╡рд░реНрддреА HashMap рдХрд╛! рдФрд░ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ 6-8 рд╕реЗ рдЕрдзрд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛рдиреА рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕реНрдерд╛рди рдореЗрдВ рд▓рдЧрднрдЧ рд╕рднреА рдСрдкрд░реЗрд╢рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореМрдЬреВрджрд╛ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдПрдХ рд░реАрдбрд┐рдВрдЧ рд╣реИрдВред
рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП, рдРрд╕рд╛ рдХреИрд╕реЗ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдЕрджреНрдпрддрди рдХреЗ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ:
"рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреБрдВрдЬреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдореВрд▓реНрдп рд╕реЗ рдЬреБрдбрд╝реА рдирд╣реАрдВ рд╣реИ, рддреЛ рджрд┐рдП рдЧрдП рдореИрдкрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЗрд╕ рдирдХреНрд╢реЗ рдореЗрдВ рддрдм рддрдХ рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╢реВрдиреНрдп рди рд╣реЛред рд╕рдВрдкреВрд░реНрдг рд╡рд┐рдзрд┐ рдЖрд╣реНрд╡рд╛рди рдХреЛ рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдмрд╛рд░ рдкреНрд░рддрд┐ рдХреБрдВрдЬреА рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдереНрд░реЗрдб рдкрд░ рдЕрдиреНрдп рдереНрд░реЗрдбреНрд╕ рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдЕрдкрдбреЗрдЯ рдСрдкрд░реЗрд╢рдВрд╕ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рди рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧрдгрдирд╛ рдХрдо рдФрд░ рд╕рд░рд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕ рдореИрдк рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдореИрдкрд┐рдВрдЧ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред "
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рджреЛ рдмрд╣реБрдд рдореЛрдЯреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдмреНрд▓реЙрдХ рд╣реИрдВ:
рд╕рдорд╡рд░реНрддреА HashMap.computeIfAbsent рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) { if (key == null || mappingFunction == null) throw new NullPointerException(); int h = spread(key.hashCode()); V val = null; int binCount = 0; for (Node<K,V>[] tab = table;;) { Node<K,V> f; int n, i, fh; if (tab == null || (n = tab.length) == 0) tab = initTable(); else if ((f = tabAt(tab, i = (n - 1) & h)) == null) { Node<K,V> r = new ReservationNode<K,V>(); synchronized (r) { if (casTabAt(tab, i, null, r)) { binCount = 1; Node<K,V> node = null; try { if ((val = mappingFunction.apply(key)) != null) node = new Node<K,V>(h, key, val, null); } finally { setTabAt(tab, i, node); } } } if (binCount != 0) break; } else if ((fh = f.hash) == MOVED) tab = helpTransfer(tab, f); else { boolean added = false; synchronized (f) { if (tabAt(tab, i) == f) { if (fh >= 0) { binCount = 1; for (Node<K,V> e = f;; ++binCount) { K ek; V ev; if (e.hash == h && ((ek = e.key) == key || (ek != null && key.equals(ek)))) { val = e.val; break; } Node<K,V> pred = e; if ((e = e.next) == null) { if ((val = mappingFunction.apply(key)) != null) { added = true; pred.next = new Node<K,V>(h, key, val, null); } break; } } } else if (f instanceof TreeBin) { binCount = 2; TreeBin<K,V> t = (TreeBin<K,V>)f; TreeNode<K,V> r, p; if ((r = t.root) != null && (p = r.findTreeNode(h, key, null)) != null) val = p.val; else if ((val = mappingFunction.apply(key)) != null) { added = true; t.putTreeVal(h, key, val); } } } } if (binCount != 0) { if (binCount >= TREEIFY_THRESHOLD) treeifyBin(tab, i); if (!added) return val; break; } } } if (val != null) addCount(1L, binCount); return val; }
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рд╕реЗ, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЗрд╡рд▓ рдЫрд╣ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдмрди рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рд╕рднреА рд╕реНрдерд╛рди рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣реИрдВред рдХрд╛рдлреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╕рд╛рдзрд╛рд░рдг
рдорд┐рд▓ рдореЗрдВ рд╕рдордХрд╛рд▓рди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ:
рд╕рдорд╡рд░реНрддреА HashMap.get рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди public V get(Object key) { Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek; int h = spread(key.hashCode()); if ((tab = table) != null && (n = tab.length) > 0 && (e = tabAt(tab, (n - 1) & h)) != null) { if ((eh = e.hash) == h) { if ((ek = e.key) == key || (ek != null && key.equals(ek))) return e.val; } else if (eh < 0) return (p = e.find(h, key)) != null ? p.val : null; while ((e = e.next) != null) { if (e.hash == h && ((ek = e.key) == key || (ek != null && key.equals(ek)))) return e.val; } } return null; }
рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЗрд╡рд▓ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: рдпрд╛ рддреЛ рдореВрд▓ рдХреЛрдб рдкрд░ рд▓реМрдЯреЗрдВ, рдпрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ:
String getOrPut(String key) { String result = map.get(key); return (result != null) ? result : map.computeIfAbsent(key, this::createValue); }
рдирд┐рд╖реНрдХрд░реНрд╖
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдШрд╛рддрдХ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд┐рдВрдЧ рдмрд╣реБрдд рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реЛ рдЧрдпрд╛ред рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рддрдирд╛рд╡ рдкрд░реАрдХреНрд╖рдг рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдиреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЧрд┐рд░рд╛рд╡рдЯ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд┐рдпрд╛ рдерд╛ред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЬрд╛рд╡рд╛ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ
рдареАрдХ рдХрд┐рдпрд╛:
JDK-8161372 ред
рдЗрд╕рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ, рд▓реБрднрд╛рд╡рдиреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддрдирд╛рд╡рдкреВрд░реНрдгред
рд╕рднреА рдХреЛ рдЬрд╛рд╡рд╛!
UPD1: рдХреЛрд▓реНрдбрд╡рд┐рдВрдб рджреНрд╡рд╛рд░рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдиреЛрдЯ рдХрд┐рдП
рдЬрд╛рдиреЗ рдкрд░ , рд╕рдорд╕реНрдпрд╛ рдЬреНрдЮрд╛рдд рд╣реЛ рдЬрд╛рддреА рд╣реИ:
JDK-8161372 ред рдФрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рд╡рд╛ 9 рдХреЗ рд▓рд┐рдП рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛ 8, рдЬрд╛рд╡рд╛ 11 рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрд╛рд╡рд╛ 13 рдореЗрдВ рд▓реЗрдЦ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд╕рдордп, рдпрд╣ рд╡рд┐рдзрд┐ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реАред
UPD2: vkovalchuk рдиреЗ рдореБрдЭреЗ рд▓рд╛рдкрд░рд╡рд╛рд╣реА рдХрд░рддреЗ
рд╣реБрдП рдкрдХрдбрд╝ рд▓рд┐рдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрд╛рд╡рд╛ 9 рдФрд░ рдирдП рдХреЗ рд▓рд┐рдП, рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ рдкрд░рд┐рдгрд╛рдо рдХреА рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╢рд░реНрдд рдЬреЛрдбрд╝рдХрд░ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
else if (fh == h
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВ рдЬрд╛рд╡рд╛ рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛:
Openjdk рд╕рдВрд╕реНрдХрд░рдг "1.8.0_222"
OpenJDK рд░рдирдЯрд╛рдЗрдо рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ (рдмрд┐рд▓реНрдб 1.8.0_222-8u222-b10-1ubuntu1 ~ 18.04.1-b10)
OpenJDK 64-рдмрд┐рдЯ рд╕рд░реНрд╡рд░ VM (рдмрд┐рд▓реНрдб 25.222-b10, рдорд┐рд╢реНрд░рд┐рдд рдореЛрдб)
рдФрд░ рдЬрдм рдореИрдВрдиреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рджреЗрдЦрд╛, рддреЛ рдореИрдВрдиреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдореИрдВ рднрдЯрдХ рдЧрдпрд╛ред
рдЗрд╕рд▓рд┐рдП рдиреНрдпрд╛рдп рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рдкрд╛рда рд╕рд╣реА рдХрд┐рдпрд╛ред