Осврћући се на Јава-АрраиЛист наспрам ЛинкедЛист наспрам Вецтор

Looking Back Java Arraylist Vs



Преглед листе

Листа, како јој и само име каже, је скуп уређених елемената. Када разговарамо о Листу, лако га је упоредити са Сетом. Скуп је група јединствених и несређених елемената.

Следећа слика је хијерархијски дијаграм класе колекције.
слика




АрраиЛист наспрам ЛинкедЛист наспрам Вецтор

Као што се може видети са горње слике, сви они примењују интерфејс Лист. Њихова употреба је слична, главна разлика је у томе што имају различите брзине рада за различите операције.



АрраиЛист је низ чија се величина може променити. Када се елемент дода у АрраиЛист, његова величина се динамички повећава. Елементима се може приступити директно путем метода гет () и сет (), јер АрраиЛист је заправо низ (линеарна листа налога) ,。 ЛинкедЛист је двоструко повезана листа . Његове методе адд () и ремове () брже су од АрраиЛист, али методе гет () и сет () су спорије од АрраиЛист. Вектор је сличан АрраиЛист, али Вектор је синхрони. Ако се налазите у окружењу безбедном за нит, бољи избор је коришћење АрраиЛист. Приликом додавања елемената, када се премаши почетни капацитет, Вецтор-у и АрраиЛист-у треба више простора: Вецтор треба удвостручити величину низа, а АрраиЛист треба повећати за 50%.



ЛинкедЛист такође имплементира интерфејс Куеуе , Дакле, има више функција у редовима од АрраиЛист и Вецтор и неке методе као што су оффер (), пеек (), анкета () итд.


Пример АрраиЛист

public static void main(String[] args) { ArrayList list = new ArrayList() list.add(1) list.add(2) list.add(2) list.add(3) list.add(4) Iterator iter = list.iterator() while(iter.hasNext()) { System.out.println(iter.next()) } }

Пример ЛинкедЛист

public static void main(String[] args) { LinkedList list = new LinkedList() list.add(3) list.add(2) list.add(4) list.add(6) list.add(2) list.addFirst(1) list.addLast(7) Iterator iter = list.iterator() while(iter.hasNext()) { System.out.println(iter.next()) } }

Из наведеног се види да је њихова употреба иста, а главна разлика лежи у њиховој интерној имплементацији и сложености операција.


Вецтор

Вецтор је готово једнак АрраиЛист, главна разлика је у томе што је Вецтор синхронизован. Због тога је Вецтор скупљи од АрраиЛист-а. Обично већина програмера користи АрраиЛист, они могу да напишу свој код за синхронизацију.




Поређење перформанси АрраиЛист наспрам ЛинкедЛист

Сложеност времена је следећа:
слика

Адд () у табели односи се на адд (Е е) (то јест на додавање елемента на крају листе), а метода ремове () односи се на ремове (инт индек).

Сложеност времена операције уметања / брисања АрраиЛист-а за било који индекс је О (н), док је време операције на крају листе О (1), јер се претходни елемент не користи у низу када ради на крају. преместите Плаце.

Сложеност времена операције уметања / брисања ЛинкедЛист-а за било који индекс је О (н), док је време операције на глави или репу листе О (1), јер операција главе или репа треба само променити Показивач главе и довољан је показивач репа, без рада показивача било ког елемента у средини.

Низови

  • Временска сложеност проналаска положаја за уметање / брисање је О (1)
  • Временска сложеност операција уметања / брисања је О (н)

Повезане листе:

  • Временска сложеност проналаска положаја за уметање / брисање је О (н)
  • Временска сложеност операција уметања / брисања је О (1)

Овде користите следећи код да бисте тестирали њихове перформансе

public static void main(String[] args) { ArrayList arrayList = new ArrayList() LinkedList linkedList = new LinkedList() // ArrayList add long startTime = System.nanoTime() for (int i = 0 i <100000 i++) { arrayList.add(i) } long endTime = System.nanoTime() long duration = endTime - startTime System.out.println('ArrayList add: ' + duration) // LinkedList add startTime = System.nanoTime() for (int i = 0 i <100000 i++) { linkedList.add(i) } endTime = System.nanoTime() duration = endTime - startTime System.out.println('LinkedList add: ' + duration) // ArrayList get startTime = System.nanoTime() for (int i = 0 i <10000 i++) { arrayList.get(i) } endTime = System.nanoTime() duration = endTime - startTime System.out.println('ArrayList get: ' + duration) // LinkedList get startTime = System.nanoTime() for (int i = 0 i <10000 i++) { linkedList.get(i) } endTime = System.nanoTime() duration = endTime - startTime System.out.println('LinkedList get: ' + duration) // ArrayList remove startTime = System.nanoTime() for (int i = 9999 i >=0 i--) { arrayList.remove(i) } endTime = System.nanoTime() duration = endTime - startTime System.out.println('ArrayList remove: ' + duration) // LinkedList remove startTime = System.nanoTime() for (int i = 9999 i >=0 i--) { linkedList.remove(i) } endTime = System.nanoTime() duration = endTime - startTime System.out.println('LinkedList remove: ' + duration) }

Излаз је следећи:

ArrayList add: 7064206 LinkedList add: 14325298 ArrayList get: 144756 LinkedList get: 120728232 ArrayList remove: 502540684 LinkedList remove: 119826646

слика

Разлика у њиховим перформансама је значајна. ЛинкедЛист је бржи за адд () и ремове () него за АрраиЛист, али гет () је спорији. Према сложености и резултатима тестова, лако можемо знати када користити АрраиЛист, а када ЛинкедЛист. Укратко, ЛинкедЛист треба користити у следећим ситуацијама:

  • Без пуно насумичног приступа

  • Ако постоји много операција додавања / уклањања


Сигурна употреба

Будући да ове поткласе нису заштићене од нити, ако се безбедно користе у више нити, морају сами да примене синхронизацију приступа. Једно решење је конструисање синхронизоване Листе при креирању Листе:

List list = Collections.synchronizedList(new LinkedList())

Референтни чланак