Топ 10 въпроси за колекциите в Ява

Топ 10 на въпроси за колекции в Java

1. Кога се използва LinkedList вместо ArrayList?

ArrayList всъщност е масив, елементите могат да бъдат достъпни директно от индекса. В случай на препълване на масива има нужда от нови, с повече пространство. Поставяне и движение на всички елементи ще отнеме O (N) време. Също така, е необходимо да добавяте и изтривате елементи, за да се движат съществуващите елементи в масива. Това е може би най-големият недостатък на използването на ArrayList.

LinkedList - това е двойно списък с връзки към елементите. По този начин, за да получите достъп до даден елемент в центъра, е необходимо да търсите от началото до края на листа. От друга страна, добавянето и премахването на елемент LinkedList-бързо, защото тези операции променят само самата списъка.

Най-лошите времена се сравняват по-долу:


Независимо от времето за изпълнение, използването на паметта трябва да бъде обмислено индивидуално за големи списъци. В LinkedList всеки възел трябва да има най-малко две допълнителни показалка да завърже предишните и следващите възли в момента като ArrayList само масив елементи.

Още сравнения изброява ArrayList, LinkedList и Vector (инж.).

2. Ефективно еквивалент да се отстранят елементите, докато повтаряне колекция

Единственият правилен път за модификации (изтривания) колекции по време на итерация - е да използвате Iterator.remove ().
Например:

Най-често срещаният вариант на грешката:

Можете да получите ConcurrentModificationException а кодът по-горе. Това се случва, поради причината, че итератора е генериран за преместване през списъка, но в същото време на листа се променя Iterator.remove () повикване.
Както е записано в документацията за това изключение,

«По принцип не е допустимо за една нишка да променя колекция, докато друга нишка се повтаряне върху него.»
Като цяло, неприемлива ситуация, в която една тема (конци) промени в събирането, докато друга нишка минава през него.

3. Как да конвертирате Списък на INT [] масив?

Най-лесният начин да направите това е да се използва ArrayUtils. вариращи в Apache Commons Lang библиотека.

В JDK не намаляване на този израз. Не забравяйте, че не можете да използвате List.toArray (), защото този израз се превръща в Списък число [] (която не е примитивен тип, прибл. Превод.). Правилният начин е следното:

4. Как да конвертирате множество инт [], за да списъка?

Най-лесният начин е да се използва като ArrayUtils в Apache Commons Lang библиотека. както по-горе.

Също така, няма намаляване на JDK за този израз.

5. Какво е най-добрият начин да се филтрират колекция?

Можете да използвате трета страна пакети, като например гуава или Apache Commons Lang за увеличаване на функционалността. И двете от тези пакети са метод филтър () (в клас Collections2 от гуава и CollectionUtils от Apache). филтър () метод връща елементите, които съответстват на предиката взето (предикати).

В JDK трудно. Добрата новина е, че в Java ще бъде добавен 8 предикати (вече е добавен. Прибл. Превод.), Но сега ще трябва да използвате итератор да се движат през цялата колекция.

Разбира се, можете да се симулира пътя, който следва гуава и Apache, след като се запознаят с нов интерфейс предикат.

Сега ние можем да използваме следния код към колекцията за филтриране:

6. Не е трудно да се превърнат в списъка, съдържащ?

Има два начина да направите това, в зависимост от това как искате да определите равенство. Първата част от код поставя в списъка в HashSet. След това дубликата се определя главно от хеш-код (). Като правило, това ще работи. Но ако трябва да се вземат предвид сравнението на пътя, а след това Budel добре да се използват втората част от кода, който можете да определите своя сравнение.


7. Как мога да премахване на дублиращи се елементи от един ArrayList?

Този въпрос е до известна степен свързани с въпроса за по-горе.
Ако това не е от значение реда на елементи в ArrayList, умен ход ще бъде да се постави листа в комплект (Set), за да премахнете dubliuatov, а след това се върнете към списъка (List) за вас.
По-долу е един пример.

Ако поръчате е на стойност позиции, поръчката може да се постигне чрез поставяне на списъка в LinkedHashSet. който е в стандартната JDK.

8. асорти Collection

Има няколко начина да подкрепят подредени събирането на Java. Всички те осигуряват събирането на естествения ред, или в определеното за сравнение. В случай на естествения ред вие също трябва да изпълнява Сравними интерфейс елемент.

  1. Collections.sort () да сортирате списъка. Както е посочено в документацията на Java, това сортиране е стабилен и осигурява изпълнението на п дневник (н).
  2. Приоритетна опашка гарантира навременно опашка. Разликата между приоритетна опашка и Collections.sort (), която поддържа, за приоритетна опашка опашки през цялото време, но можете да получите само първия ред. Вие не можете да получите достъп до случайни елементи като PriorityQueue.get (4).
  3. Ако няма дублиране при събирането, можете да изберете TreeSet. Също така, тъй като приоритетна опашка, TreeSet поддържа подреден набор от всички времена. Можете да получите malenny Sama или голям елемент на TreeSet, но все още не може да има произволен достъп до елементите.

Казано по-просто, Collections.sort () предоставя еднократна нареди списък. Приоритетна опашка TreeSet и поддържа подредена съвкупност от постоянно се налага да плащат за тази липса на достъп до индексирани елементи.

9. Collections.emptyList () или нов например

Същият въпрос се отнася и за emptyMap () и emptySet ().

И двата метода се върнат празен списък, но Collections.emptyList () неизменни (неизменен) списък. Това означава, че не можете да добавяте нови елементи към "празен" списъка. На фона на всеки метод повикване Collections.emptyList () всъщност не се създаде нова инстанция на празен списък. Вместо това, той ще използва съществуващата инстанция на празен отново. Ако не сте запознати с Сингълтън (Сингълтън, tyts. Прибл. Превод.) Как да се изработи модел, трябва да се разбере какво се има предвид. Това трябва да ви даде бо-голяма производителност, когато се ползва често.

Има два начина за копиране на оригиналния списък на назначените. Един от начините - използването на ArrayList конструктор.

Списъкът на дестинация трябва да бъде поне толкова дълго, колкото списъка на източниците.
Което означава, че окончателният списък не трябва да бъде по-кратък от оригинала.

list.toArray (нов цяло число [0]) - методът използва отражение да се създаде набор за този метод трябва тип клас за нов масив. Идеята може да се прехвърли просто Integer.class, но можете да се противопостави на това, също, като се използват getClass (и боклук []) vyderut абсолютно същия Integer.class. Накрая Статично метод ArrayUtils.toPrimitive ще получи масив от цяло число [], който е вече смила до примитивна Int.

Да, разбрах, spasibo.ya. точно такъв подход е имал не videl.Tam ако се вгледате в SRC, те набута ви нула, ако пишете нов Integer [п] за н-голяма от действителната lista.tozhe не най-приятната

Грешиш. Колекция просто трябва да се сравни сложността (O голям) на техните методи.

ПИ на вода (1) може да получи само в началото и края, се счита за получаване на вариант съгласно всяка индекс обаче О (п)

Защо трябва да се сравни в затруднение (O голям) на техните методи? Трябва да се сравни функции и предимства на всеки колекции. вместо методи

Така че това е част от своите функции и предимства един до друг. Сложността, с които те практикуват основните методи за събиране (добавете се премахне)

Тъй като данните се пише, за да добавите метод = Сложността
-// - // - изтриване = сложност на метода на обезвреждане
-// - // - избран = сложност на метода GET
Ти казваш едно и също нещо, но с други думи.

При избора на събиране трябва да се има предвид, как се съхраняват в обектите (съхранява последователно добавяне, сортиране). Ще бъдат използвани в многонишкова среда

Аз съм наясно, че има и други методи, аз съм ги отбележи като основен. Вие сте твърде подчерта към тях.
И това е желателно да се програмира на ниво интерфейс, не реализации

Не, защото е избран например чрез методи Изберете, искам да кажа на всички методи, включително getFirst (), getLast и така нататък ...

И това е желателно да се програмира на ниво интерфейс, не реализации
Желателно е, но в действителност не винаги работи ...

Оказва се, почти винаги. С колекция, която е сигурно винаги работи. Виж всички методи LL е реализацията на интерфейси.

Ако имате нуждата да се заемат от началото от края, всичко. Интерфейсът също има
docs.oracle.com/javase/7/docs/api/java/util/Deque.html