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

рдореИрдВ рдЖрдкрдХреЛ рдирдорд╕реНрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рд╣реЗрдмреНрд░рд╛рд▓реБрдбреА!

рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдпрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рд╡рд┐рдЬреБрдЕрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ (рд╣рдорд╛рд░реА рддрд╕реНрд╡реАрд░реЗрдВ рд╕рдм рдХреБрдЫ рд╣реИрдВ), рд╢реБрд░реБрдЖрддреА рдЬрд╛рд╡рд╛ рд╡рд┐рдЬреБрдЕрд▓реНрд╕, рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдирдП ArrayList () рд▓рд┐рдЦрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдереЛрдбрд╝рд╛ рдкрддрд╛ рд╣реИред



рдЖрдЬ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ ArrayLists рдХреА

ArrayList - рд╕реВрдЪреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЬрд╛рд╡рд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рд░рдгреА рдмрдирдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдмрдврд╝ рдпрд╛ рд╕рд┐рдХреБрдбрд╝ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред ArrayList рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЕрдкрдирд╛ рдЖрдХрд╛рд░ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рдЖрдпрд╛рдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред ArrayList рддрддреНрд╡ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ null рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред



рд╡рд╕реНрддреБ рдирд┐рд░реНрдорд╛рдг


ArrayList<String> list = new ArrayList<String>(); 

рдирдИ рдмрдирд╛рдИ рдЧрдИ рд╕реВрдЪреА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рддрддреНрд╡ рдФрд░ рдЖрдХрд╛рд░ рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВред

рдПрд▓реАрдореЗрдВрдЯрдбреИрдЯрд╛ рд╡реИрд▓реНрдпреВрдЬ рдХрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ (рдЬреЗрдиреЗрд░рд┐рдХ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ) рдХреЗ рдПрдХ рд╕рд░рдгреА рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ [] ред рдпрджрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ 10 рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА рд╡рд╕реНрддреБ (рдПрдХ рдбрд╛рд▓реА рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ)ред

 elementData = (E[]) new Object[10]; 



рдЖрдк ArrayList (рдХреНрд╖рдорддрд╛) рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реВрдЪреА рдХреНрд╖рдорддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рдирд╛


 list.add("0"); 




рдРрдб (рдорд╛рди) рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреАрдЬреЗрдВ рд╣реЛрддреА рд╣реИрдВ:

1) рдпрд╣ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдирдпрд╛ рддрддреНрд╡ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рд╣реИ;

 ensureCapacity(size + 1); 

2) рдПрдХ рддрддреНрд╡ рд╕рд░рдгреА рдХреЗ рдЕрдВрдд ( рдЖрдХрд╛рд░ рдореВрд▓реНрдп рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

 elementData[size++] = element; 

рд╣рдо рд╕рдВрдкреВрд░реНрдг рд╕реБрдирд┐рд╢реНрдЪрд┐рддрддрд╛ (рдиреНрдпреВрдирддрдо рдХреНрд╖рдорддрд╛) рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╣рдо рдХреЗрд╡рд▓ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рд╕рд░рдгреА рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рдирдИ рдХреНрд╖рдорддрд╛ рдХреА рдЧрдгрдирд╛ рд╕реВрддреНрд░ (рдкреБрд░рд╛рдиреЗрддрд╛ * 3) / 2 + 1 рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИ ред рджреВрд╕рд░рд╛ рдмрд┐рдВрджреБ рддрддреНрд╡реЛрдВ рдХреА рдирдХрд▓ рд╣реИред рдпрд╣ рдореВрд▓ System.arraycopy () рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдЬреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

 // newCapacity -    elementData = (E[])new Object[newCapacity]; // oldData -       System.arraycopy(oldData, 0, elementData, 0, size); 


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд 15 рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рд▓реВрдк рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:
 list.add("1"); 



...

 list.add("9"); 




 list.add("10"); 

11 рд╡реЗрдВ рддрддреНрд╡ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдЪреЗрдХ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА рдореЗрдВ рдХреЛрдИ рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдПрдХ рдирдпрд╛ рд╕рд░рдгреА рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ System.arraycopy () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред



рдЙрд╕рдХреЗ рдмрд╛рдж, рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЬрд╛рд░реА рд╣реИ



...

 list.add("14"); 





рд╕реВрдЪреА рдХреЗ "рдордзреНрдп" рдореЗрдВ рдЬреЛрдбрд╝рдирд╛


 list.add(5, "100"); 

рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЗрдВрдбреЗрдХреНрд╕ рд╡рд╛рд▓реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рддреАрди рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ:

1) рдпрд╣ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдирдпрд╛ рддрддреНрд╡ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рд╣реИ;

 ensureCapacity(size+1); 

2) System.arraycopy () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдП рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рддреИрдпрд╛рд░ рдХрд░реЗрдВ ;

 System.arraycopy(elementData, index, elementData, index + 1, size - index); 



3) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рддрддреНрд╡ рдХрд╛ рдореВрд▓реНрдп рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 elementData[index] = element; size++; 




рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрдм рдХреЛрдИ рддрддреНрд╡ рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдПрд░реЗ рдореЗрдВ рдХреЛрдИ рдЦрд╛рд▓реА рд╕реАрдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ System.arraycopy () рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рджреЛ рдмрд╛рд░ рд╣реЛрдЧрд╛: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ ensCapacity () рдореЗрдВ , рджреВрд╕рд░рд╛ рдРрдб (рдЗрдВрдбреЗрдХреНрд╕, рд╡реИрд▓реНрдпреВ) рд╡рд┐рдзрд┐ рдореЗрдВ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреВрд░реЗ рдРрдб рдСрдкрд░реЗрд╢рди рдХреА рдЧрддрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред

рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрдм рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ "рдордзреНрдп" рддрдХ, рдпрд╣ рдРрдбрдСрд▓ (рд╕реВрдЪрдХрд╛рдВрдХ, рд╕рдВрдЧреНрд░рд╣) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рдпрд╣ рд╡рд┐рдзрд┐ System.arraycopy () рдХреЛ рддреАрди рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЕрдВрдд рдореЗрдВ рдпрд╣ рддрддреНрд╡ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реЛрдЧрд╛ред


рдЖрдЗрдЯрдо рд╣рдЯрд╛рдПрдВ


рдЖрдЗрдЯрдо рд╣рдЯрд╛рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:
- рдирд┐рдХрд╛рд▓реЗрдВ (рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛) рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛
- рдореВрд▓реНрдп рдирд┐рдХрд╛рд▓реЗрдВ (рдореВрд▓реНрдп) рджреНрд╡рд╛рд░рд╛

рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ

 list.remove(5); 

рдкрд╣рд▓реЗ, рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХрд┐рддрдиреЗ рдЖрдЗрдЯрдо рдХреЙрдкреА рдХрд░рдиреЗ рд╣реИрдВред

 int numMoved = size - index - 1; 

рдЙрд╕рдХреЗ рдмрд╛рдж System.arraycopy () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ

 System.arraycopy(elementData, index + 1, elementData, index, numMoved); 

рд╕рд░рдгреА рдХрд╛ рдЖрдХрд╛рд░ рдХрдо рдХрд░реЗрдВ рдФрд░ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдПрдВ

 elementData[--size] = null; // Let gc do its work 


рдорд╛рди рд╕реЗ рд╣рдЯрд╛рддреЗ рд╕рдордп, рдПрдХ рд▓реВрдк рдореЗрдВ рд╕реВрдЪреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХрд╛ рдорд┐рд▓рд╛рди рд╣реЛрдиреЗ рддрдХ рд╕реНрдХреИрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рдЖрдЗрдЯрдо рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкрд░рд┐рд╡рд░реНрдзрди 1: рдЬреИрд╕рд╛ рдХрд┐ рдорд╛рдЗрдХрдорд┐рд░рдЬрд╝рд╛рдпрдиреЛрд╡ рдиреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдиреЛрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЬрдм рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХрдо рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрдЬреАрдм рд╕реНрдореГрддрд┐ рд▓реАрдХ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, trimToSize () рд╡рд┐рдзрд┐ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рди рдХрд░реЗрдВред


рдкрд░рд┐рдгрд╛рдо


- рд╣реЗ (1) рдХреЗ рджреМрд░рд╛рди рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╡рд╕реНрддреБрдУрдВ рддрдХ рддреНрд╡рд░рд┐рдд рдкрд╣реБрдВрдЪ;
- рд░реИрдЦрд┐рдХ рд╕рдордп рдУ (рдПрди) рдореЗрдВ рдореВрд▓реНрдп рд╕реЗ рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ;
- рддрддреНрд╡реЛрдВ рдХреЛ рд╕реВрдЪреА рдХреЗ "рдордзреНрдп" рд╕реЗ рдбрд╛рд▓рд╛ рдФрд░ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдзреАрдорд╛;
- рдЖрдк рдЕрд╢рдХреНрдд рд╕рд╣рд┐рдд рдХрд┐рд╕реА рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
- рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВред


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


рд╕реНрд░реЛрдд ArrayList
JDK7 рд╕реЗ ArrayList рд╕реНрд░реЛрдд
JDK рдХреЗ рд╕реНрд░реЛрдд OpenJDK рдФрд░ рд╡реНрдпрд╛рдкрд╛рд░ 6 рд╕реНрд░реЛрдд рд░рд┐рд▓реАрдЬрд╝ - рдмрд┐рд▓реНрдб b23


рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ / рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдФрд░ рдпрд╣ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

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


All Articles