1. Как ArrayList
е структуриран
ArrayList
е Java класът, използван най-често за съхраняване на елементи. И така, How ArrayList
работи и защо всички го харесват толкова много?
Структурата на ArrayList
е проста и гениална. Всеки ArrayList
обект съдържа две полета:
- Масив от елементи
- Променлива
size
, която съхранява броя на елементите в списъка
Вътрешно ArrayList
обектът съдържа най-обикновен масив! Но това не е всичко. Има и променлива размер , която съхранява дължината на списъка. Ето How работи:
Първоначално дължината на масива в списъка е 10. А променливата size
е 0.
Ако добавите елемент към списъка, той ще бъде съхранен в 0-та клетка на масива и size
ще се увеличи до 1.
Ако добавите още един елемент, той ще се запише в 1-ва клетка и size
отново ще се увеличи с 1 и ще стане equals на две.
Ако добавите друг елемент, когато няма повече място в масива, тогава в add()
метода се случва следното:
- Създава се нов масив , който е един и половина пъти по-дълъг от предишния
- Всички елементи от стария масив се копират в новия масив.
- В
ArrayList
обекта препратката към новия масив замества препратката към стария . - Предаденият елемент се записва в 10-та клетка на новия масив.
- Променливата за размера се увеличава с 1 и сега ще бъде равна на 11
Нещо подобно се случва при добавяне (вмъкване) на елемент в средата на списъка. Съществуващите елементи се изместват с 1 надясно, а преминалият елемент се записва в новоосвободената клетка на масива.
Сега ще разгледаме най-основните сценарии, включващи списъци:
2. Добавяне на елемент къмArrayList
Нека да разгледаме Howво се случва в списъка, когато към него се добавят елементи. Веднага след създаването на обект ArrayList имаме нещо подобно в паметта:
Имаме ArrayList
обект, който съдържа две полета (две променливи): контейнер (масив data
) и брой съхранени елементи ( size
). Променливата data
съхранява препратка към контейнер (масив), който може да съхранява 10 елемента.
Ако решим да добавим числото 5 към масива, получаваме следната картина:
Сега масивът съхранява елемента 5 и size == 1
.
Ако някой извика size()
метода на нашия ArrayList
обект сега, върнатата стойност ще бъде броя на елементите, съхранени в списъка: 1. Броят на елементите в списъка не е същият като капацитета за съхранение на масива.
Нито текущият капацитет за съхранение, нито самият масив някога ще бъдат достъпни (видими) извън обекта ArrayList
. Това са и винаги ще бъдат ArrayList
вътрешните данни на .
Нека добавим още 7 числа към списъка: 10, 20, 30, 40, 50, 60, 70.
Сега паметта ще изглежда така:
Ако извикате size()
метода сега, той ще върне числото 8, което е новият брой елементи в списъка. Тази стойност няма нищо общо с размера на вътрешния масив.
В тази картина има едно прекалено опростяване.
Класът ArrayList
не може да съхранява примитивни типове, така че използва Integer
типа instead of int
. Контейнерът не съхранява директно стойностите {5, 10, 20, 30, 40, 50, 60, 70}, а по-скоро препратки към Integer
обекти. Всички празни клетки в контейнера се съхраняват null
.
3. Увеличаване на дължината на списък
Нека да разгледаме Howво се случва в списъка, когато няма повече празни клетки във вътрешния му масив.
Да предположим, че имаме списък от 10 елемента:
Решаваме да добавим към него числото 100 . Ето Howво се случва в add()
метода:
Стъпка 1 — Създайте нов масив:
Стъпка 2 — Копирайте всички елементи от стария масив в новия:
Стъпка 3 — Заменете стария масив (променете препратката към ArrayList
вътрешния масив на обекта):
Стъпка 4 — Добавяне на новото число, което работихме толкова усилено, за да постигнем:
GO TO FULL VERSION