рд╣рд╛рдп рд╣рдмрдЪреЗрд▓реЛрд╡реЗрдХреА!
рдПрдХ рд▓рдВрдмреЗ рд╡рд┐рд░рд╛рдо рдХреЗ рдмрд╛рдж, рдореИрдВ рдЬрд╛рд╡рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛:
ArrayList ,
LinkedList ,
HashMap ред рдЖрдЬ, LinkedHashMap рдХреЗ рдЕрдВрджрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
рдирд╛рдо рд╕реЗ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рд╣реИрд╢ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рд╕рд╣рдЬреАрд╡рди рд╣реИред рджрд░рдЕрд╕рд▓, LinkedHashMap, HashMap рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореИрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдХреНрдпрд╛ рд╣реИ? рдЪрд▓реЛ рдареАрдХ рд╣реИредрд╡рд╕реНрддреБ рдирд┐рд░реНрдорд╛рдг
Map<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>();
Footprint{Objects=3, References=26, Primitives=[int x 4, float, boolean]}
size: 160 bytes
HashMap (рдЬреИрд╕реЗ рдЯреЗрдмрд▓, рд▓реЛрдбрдлрд╝реИрдХреНрдЯрд░, рдереНрд░реЗрд╢реЛрд▓реНрдб, рд╕рд╛рдЗрдЬрд╝, рдПрдВрдЯреНрд░реАрд╕реЗрдЯ, рдЗрддреНрдпрд╛рджрд┐) рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛,
рдирдИ рдмрдирд╛рдИ рдЧрдИ
рд▓рд┐рдВрдХреНрдбрд╢реИрдЯреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрдВред рдЧреБрдг:
- рд╣реЗрдбрд░ - рдПрдХ рджреЛрд╣рд░реА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХрд╛ рдкреНрд░рдореБрдЦред рдЖрд░рдВрдн рдореЗрдВ, рдпрд╣ рдЦреБрдж рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ;
- accessOrder - рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рддрддреНрд╡реЛрдВ рдХреЛ рдХреИрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рд╕рд╣реА рд╣реИ , рддреЛ рдЕрдВрддрд┐рдо рдкрд╣реБрдВрдЪ рдХреЗ рдХреНрд░рдо рдореЗрдВ (рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ)ред рдпрджрд┐ рдЧрд▓рдд рд╣реИ, рддреЛ рдПрдХреНрд╕реЗрд╕ рдЙрд╕ рдХреНрд░рдо рдореЗрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рддрддреНрд╡ рдбрд╛рд▓реЗ рдЧрдП рдереЗред
LinkedHashMap рд╡рд░реНрдЧ рдХреЗ
рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛рдлреА рдЙрдмрд╛рдК рд╣реИрдВ, рдЙрдирдХреЗ рд╕рднреА рдХрд╛рд░реНрдп рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░
рдПрдХреНрд╕реЗрд╕рдСрд░реНрдбрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╣реИрдВред рд▓реЗрдХрд┐рди
рд╣реЗрдбрд░ рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдУрд╡рд░рд░рд╛рдЗрдб
рдЗрдирд┐рдЯ () рд╡рд┐рдзрд┐ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ (
рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд╢рдк рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ )ред
void init() { header = new Entry<K,V>(-1, null, null, null); header.before = header.after = header; }
рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЧреБрдг рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣реИрдВ, рдЖрдк рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рдирд╛
linkedHashMap.put(1, "obj1");
Footprint{Objects=7, References=32, Primitives=[char x 4, int x 9, float, boolean]}
size: 256 bytes
рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп,
createEntry рдореЗрдердб
(рд╣реИрд╢, рдХреА, рд╡реИрд▓реНрдпреВ, рдмрдХреЗрдЯрдЗрдВрдбреЗрдХреНрд╕) рдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ (рдЪреЗрди
рдкреБрдЯ рджреНрд╡рд╛рд░рд╛
) (> -
addEntry () ->
createEntry () ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
void createEntry(int hash, K key, V value, int bucketIndex) { HashMap.Entry<K,V> old = table[bucketIndex]; Entry<K,V> e = new Entry<K,V>(hash, key, value, old); table[bucketIndex] = e; e.addBefore(header); size++; }
рдкрд╣рд▓реА рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЯрдХрд░рд╛рд╡ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬреЛрдбрд╝ рдШрдЯрд┐рдд рд╣реЛрдЧрд╛, рд╣рдо рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ)

рдЪреМрдереА рдкрдВрдХреНрддрд┐ рд░рд┐рдлрд╝рд╛рдЗрди рдбрдмрд▓ рд▓рд┐рдВрдХ рд╕реВрдЪреА рд▓рд┐рдВрдХ

AddEntry () рдкрджреНрдзрддрд┐ рдореЗрдВ рдЖрдЧреЗ рдЬреЛ рдХреБрдЫ рднреА рд╣реЛрддрд╛ рд╣реИ рд╡рд╣ рдпрд╛ рддреЛ "рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣рд┐рдд" рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдореВрд▓ рд╡рд░реНрдЧ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред
рдХреБрдЫ рдФрд░ рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВред
linkedHashMap.put(15, "obj15");
Footprint{Objects=11, References=38, Primitives=[float, boolean, char x 9, int x 14]}
size: 352 bytes

linkedHashMap.put(4, "obj4");
Footprint{Objects=11, References=38, Primitives=[float, boolean, char x 9, int x 14]}
size: 448 bytes

рдЬрдм рдЖрдк рдЕрдЧрд▓рд╛ рддрддреНрд╡ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЯрдХрд░рд╛рд╡ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЪрд╛рдмрд┐рдпрд╛рдБ 4 рдФрд░ 38 рд╡рд╛рд▓реЗ рддрддреНрд╡ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рддреЗ рд╣реИрдВ
linkedHashMap.put(38, "obj38");
Footprint{Objects=20, References=51, Primitives=[float, boolean, char x 18, int x 24]}
size: 560 bytes

рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕реА рддрддреНрд╡ рдХреЗ рдмрд╛рд░-рдмрд╛рд░ рд╕рдореНрдорд┐рд▓рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рдПрдХ рд╣реА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рддрддреНрд╡ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ), рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдХреНрд░рдо рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред
accessOrder == рд╕рдЪ
рдЕрдм рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдЬрдм
рдПрдХреНрд╕реЗрд╕рдСрд░реНрдбрд░ рд╕рдВрдкрддреНрддрд┐
рд╕рддреНрдп рд╣реИ ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ,
LinkedHashMap рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдЖрдк
рдЧреЗрдЯ () рдФрд░
рдкреБрдЯ () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ
рд╣реИрдВ , рддреЛ рддрддреНрд╡реЛрдВ рдХрд╛ рдХреНрд░рдо рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ - рдЬрд┐рд╕ рддрддреНрд╡ рдХреЛ рд╣рдо рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдЕрдВрдд рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
Map<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>(15, 0.75f, true) {{ put(1, "obj1"); put(15, "obj15"); put(4, "obj4"); put(38, "obj38"); }};

iterators
рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕реБрдВрджрд░ рд╣реИ:
рдЦреИрд░, рдЕрд╕рдлрд▓-рдЙрдкрд╡рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрддреНрд╡реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ - рд╕рд╛рдордЧреНрд░реА рдХреЛ рди рдмрджрд▓реЗрдВ рдпрд╛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдзреНрдпрд╛рди рди рд░рдЦреЗрдВред
рдпреЛрдЧ рдХреЗ рдмрдЬрд╛рдп
рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдореВрд▓
HashMap рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдереЛрдбрд╝реА рд╣реАрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрдмрдХрд┐
рдРрдб (), рдирд┐рд╖реНрдкрд╛рджрди
(), рдирд┐рд╖реНрдХрд╛рд╕рди
() рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рд╕реНрдерд┐рд░ рд░рд╣рддрд╛ рд╣реИ - O (1)ред рдпрд╣ рддрддреНрд╡реЛрдВ рдФрд░ рдЙрдирдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдореЗрдВ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЧрд╣ рд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд┐рдкреНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдХрдо рд╢реБрд▓реНрдХ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЛ рд▓реЗрддрд╛ рд╣реИ,
рд╣рд╛рд╢рдк рдФрд░
рд▓рд┐рдВрдХреНрдбрд╣рд╛рд╢рдк рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрдИ рдЧрдВрднреАрд░ рдЕрдВрддрд░ рдирд╣реАрдВ
рд╣реИрдВ ред рдЖрдк рдХреБрдЫ рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рджреНрд╡рд┐рджрд┐рд╢ рд╕рдВрдЪрд╛рд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рдг () рдФрд░ рд╕рдорд░реВрдк () рддрд░реАрдХреЗ рдереЛрдбрд╝реЗ рд╕рд░рд▓ рд╣реИрдВ;
- LinkedHashMap.Entry classRemoval () рдФрд░ recordAccess () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ ( рдПрдХреНрд╕реЗрд╕ рдПрдбрд░ рдХреЗ рд╕рд╛рде рдЕрдВрдд рдореЗрдВ рдПрдХ рддрддреНрд╡ рдбрд╛рд▓рддрд╛ рд╣реИ )ред рд╣рд╛рд╢рдкреИрдк рдореЗрдВ, рдпреЗ рджреЛрдиреЛрдВ рддрд░реАрдХреЗ рдЦрд╛рд▓реА рд╣реИрдВред
рд╕рдВрджрд░реНрдн
рд▓рд┐рдВрдХреНрдбрд╣рд╛рд╢рдкреЙрдЗрдВрдЯ рд╕реНрд░реЛрддJDK рдХреЗ рд╕реНрд░реЛрдд
OpenJDK рдФрд░ рд╡реНрдпрд╛рдкрд╛рд░ 6 рд╕реНрд░реЛрдд рд░рд┐рд▓реАрдЬрд╝ - рдмрд┐рд▓реНрдб b23рдорд╛рдк рдЙрдкрдХрд░рдг -
рд╕реНрдореГрддрд┐-рдорд╛рдкрдХ рдФрд░
рдЕрдорд░реВрдж (Google рдХреЛрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп)ред
1 -
RemoveEldestEntry рдореЗрдердб
(Map.Entry рд╕рдмрд╕реЗ рдмрдбрд╝рд╛) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛
рдЧрд▓рдд рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИ ред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХрд┐рд╕реА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреИрд╢ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (
рдПрдХреНрд╕рдкрд╛рдпрд░рд┐рдВрдЧ рджреЗрдЦреЗрдВ)ред
RemoveEldestEntry () рд╕рд╣реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдзрд┐рдХрддрдо рдкрд╛рд░ рд╣реЛрдиреЗ рдкрд░ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдирд╛ рдЖрдЗрдЯрдо рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдорджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред