рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВред LinkedHashMap

рд╣рд╛рдп рд╣рдмрдЪреЗрд▓реЛрд╡реЗрдХреА!

рдПрдХ рд▓рдВрдмреЗ рд╡рд┐рд░рд╛рдо рдХреЗ рдмрд╛рдж, рдореИрдВ рдЬрд╛рд╡рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛: 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 (рдЬреИрд╕реЗ рдЯреЗрдмрд▓, рд▓реЛрдбрдлрд╝реИрдХреНрдЯрд░, рдереНрд░реЗрд╢реЛрд▓реНрдб, рд╕рд╛рдЗрдЬрд╝, рдПрдВрдЯреНрд░реАрд╕реЗрдЯ, рдЗрддреНрдпрд╛рджрд┐) рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирдИ рдмрдирд╛рдИ рдЧрдИ рд▓рд┐рдВрдХреНрдбрд╢реИрдЯреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрдВред рдЧреБрдг:

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"); }}; // {1=obj1, 15=obj15, 4=obj4, 38=obj38} linkedHashMap.get(1); // or linkedHashMap.put(1, "Object1"); // {15=obj15, 4=obj4, 38=obj38, 1=obj1} 






iterators


рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕реБрдВрджрд░ рд╣реИ:

 // 1. Iterator<Entry<Integer, String>> itr1 = linkedHashMap.entrySet().iterator(); while (itr1.hasNext()) { Entry<Integer, String> entry = itr1.next(); System.out.println(entry.getKey() + " = " + entry.getValue()); } // 2. Iterator<Integer> itr2 = linkedHashMap.keySet().iterator(); while(itr2.hasNext()) System.out.println(itr2.next()); // 3. Iterator<String> itr3 = linkedHashMap.values().iterator(); while (itr3.hasNext()) System.out.println(itr3.next()); 

рдЦреИрд░, рдЕрд╕рдлрд▓-рдЙрдкрд╡рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрддреНрд╡реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ - рд╕рд╛рдордЧреНрд░реА рдХреЛ рди рдмрджрд▓реЗрдВ рдпрд╛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдзреНрдпрд╛рди рди рд░рдЦреЗрдВред


рдпреЛрдЧ рдХреЗ рдмрдЬрд╛рдп


рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдореВрд▓ HashMap рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдереЛрдбрд╝реА рд╣реАрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрдмрдХрд┐ рдРрдб (), рдирд┐рд╖реНрдкрд╛рджрди (), рдирд┐рд╖реНрдХрд╛рд╕рди () рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рд╕реНрдерд┐рд░ рд░рд╣рддрд╛ рд╣реИ - O (1)ред рдпрд╣ рддрддреНрд╡реЛрдВ рдФрд░ рдЙрдирдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдореЗрдВ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЧрд╣ рд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд┐рдкреНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдХрдо рд╢реБрд▓реНрдХ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рд╣рд╛рд╢рдк рдФрд░ рд▓рд┐рдВрдХреНрдбрд╣рд╛рд╢рдк рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрдИ рдЧрдВрднреАрд░ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИрдВ ред рдЖрдк рдХреБрдЫ рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:




рд╕рдВрджрд░реНрдн


рд▓рд┐рдВрдХреНрдбрд╣рд╛рд╢рдкреЙрдЗрдВрдЯ рд╕реНрд░реЛрдд
JDK рдХреЗ рд╕реНрд░реЛрдд OpenJDK рдФрд░ рд╡реНрдпрд╛рдкрд╛рд░ 6 рд╕реНрд░реЛрдд рд░рд┐рд▓реАрдЬрд╝ - рдмрд┐рд▓реНрдб b23
рдорд╛рдк рдЙрдкрдХрд░рдг - рд╕реНрдореГрддрд┐-рдорд╛рдкрдХ рдФрд░ рдЕрдорд░реВрдж (Google рдХреЛрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп)ред


1 - RemoveEldestEntry рдореЗрдердб (Map.Entry рд╕рдмрд╕реЗ рдмрдбрд╝рд╛) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдЧрд▓рдд рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИ ред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХрд┐рд╕реА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреИрд╢ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ( рдПрдХреНрд╕рдкрд╛рдпрд░рд┐рдВрдЧ рджреЗрдЦреЗрдВ)ред RemoveEldestEntry () рд╕рд╣реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдзрд┐рдХрддрдо рдкрд╛рд░ рд╣реЛрдиреЗ рдкрд░ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдирд╛ рдЖрдЗрдЯрдо рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдорджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред

Source: https://habr.com/ru/post/In129037/


All Articles