ПредишенСледващото

Java API Колекции много фирми-е Java възприемат като много полезен заместител на стандартните масиви, което премахва своите недостатъци. Свързването Колекции предимно с ArrayList не е голяма грешка, но тези, които търсят да откриете в колекциите на много други.

За тази серия

Вие мислите, че знаете как да програмирате на Java? В действителност, повечето разработчици са само повърхностно запознати с платформата Java, учене точно това, което ви трябва, за да си свършат работата. В тази серия, Тед Neward задълбава в основната функционалност на платформата Java да се говори за малко известни факти, знания, от които могат да помогнат за решаването на най-сложните задачи за програмиране.

По същия начин, въпреки че картата (и широкото му прилагане на HashMap) са чудесен начин да създадете име-стойност двойки, или ключ-стойност, няма причина да се ограничавате до тези познати инструменти. Можете да поправите много потенциално неправилен код: избора на API или дори правилното събиране.

1. Колекции подмяна на масиви

Например, за да се генерира от съдържанието на линия масив трябва да измине целия масив и да се комбинират със съдържанието на всички елементи в един обект String. като има предвид, в колекцията има готов изпълнение на ToString на метод ().

С редки изключения, се препоръчва всеки да дойда при вас, как да конвертирате масив в колекцията възможно най-скоро. Това води до въпроса: как най-лесно да изпълняват такава трансформация? Оказва се, API Java колекции прави тази задача много просто, както е показано на Обява 1:

Списък 1. ArrayToList

Моля, имайте предвид, че списъкът за върнати колекция е неизменна, така че се опитват да се добавят нови елементи ще доведе до изхвърляне UnsupportedOperationException изключение.

И тъй като метод Arrays.asList на (), за да добавите елементи параметър се използва Списък varargs. тя може да бъде лесно да се създаде списък колекция от новосъздадените обекти.

2. итерация неефективно

Често се налага да се премести съдържанието на една колекция (особено този, който е бил създаден от масив) в друга колекция, или да изтриете някои от обектите от колекцията.

Natural решение тук - това е за да се придвижва (с помощта на итератор) събирането и да добавяте или премахвате елементи, които искате. Въпреки това, не е необходимо да се направи това.

Повторение в този случай има някои сериозни недостатъци:

  • неефективно събиране преоразмеряване с всяко добавяне или отстраняване на член;
  • всеки път, когато операцията по освобождаване на ключалката се извършва и ключалката може да бъде проблеми, свързани с едновременност;
  • може да се състезава ситуация с достъп до колекция от други потоци в момента на добавяне или премахване на елементи.

Всички тези проблеми могат да бъдат избегнати, като се използват методи addAll или removeAll. предаването им колекция, съдържаща елементи, за да бъдат добавени или изтрити.

3. за цикъл за всеки обект с Iterable интерфейс

Разширено цикъл за - това е един от най-полезните подобрения са добавени в Java 5, на който бе отстранен последната бариера за работа с колекции в Java.

Преди това, разработчиците е трябвало да получи ръчно итератор. След това с помощта на метода, в непосредствена близост (), за да получите обекта, който определя итератор и след това се проверява с метод hasNext (). има повече обекти. Започвайки с Java 5, трябва вместо това да използвате за цикъл, в който всичко това се управлява автоматично.

В действителност, този цикъл може да се използва при работа с всеки обект, който реализира Iterable интерфейс. не само с колекциите.

Обява 2 показва как да се направи списък на деца Лице обект на разположение, както итератор. Вместо да се премине една препратка към вътрешния Списъка (което ще позволи на обаждащия се от външната страна на предмета Лице за добавяне на децата си - че не би искал по-голямата част от родителите), тип лице извършва Iterable интерфейс. Този подход позволява използване на засиленото за линия за заобикаляне на децата на Лице обект.

Обява 2. Разширена цикъл за: покажи ми вашите деца

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

4. Класически и нестандартни алгоритми

Подобно, ако някога се получи около събирането, но не директно, но в обратен ред? Тя може да бъде тук полезни алгоритъм Java колекции.

Обява 2 деца в обекта лице, са изброени в реда, в който те са били предадени, но сега искаме да ги посочите в обратен ред. Мога да пиша още за линия и я поставете в нов обект на ArrayList в обратен ред, но тя може да умори използването на този код на третия или четвъртия път.

Там може да се прилага несправедливо рядко се използва алгоритъм, показан на Обява 3.

Обява 3. ReverseIterator

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

Освен това, алгоритмите, представени в класа на колекции. Определено не е последната дума в забележителната архитектура на API. Например, аз предпочитам този метод не променя съдържанието на (предавани по събирането им) директно. За такива случаи, при условие, способността да пише по поръчка алгоритми, единият от които е за пример, показан на Обява 4.

Обява 4. Опростяване ReverseIterator

5. Разширяване на Колекции API

Горното илюстрира обичай алгоритъм включва най-новите колекции на API в Java: тя може да се разшири и да се променят съгласно нуждите на разработчиците.

Например, да кажем, ние трябва да се изброят класа Person винаги е била обект на деца сортирани по възраст. Възможно е да се напише алгоритъм, който всеки път ще подредите списъка (например, като се използва метод Collections.sort), но това ще бъде много по-добре, ако класът колекция изпълнява тази си за сортиране.

Всъщност, може би не ти пука в какъв ред на обектите бяха вкарани в колекцията (което е от решаващо значение за събиране на списък). Може би просто искате да ги съхранявате по реда на сортиране.

Нито колекция от java.util пакет не отговаря на тези изисквания, но тя може да бъде доста лесно да напишете своето собствено клас. Всичко, което трябва - е създаването на интерфейс, който описва абстрактно поведение, което трябва да се осигури събирането. Например, SortedCollection интерфейс. като изключително поведенчески дестинация (Обява 5).

Обява 5. SortedCollection

Напиши изпълнението на този интерфейс е много проста (виж Обява 6).

Обявата 6. ArraySortedCollection

Тази реализация е написана "на коляното", без да се мисли за оптимизиране и, очевидно, че си струва малко преработи. Въпреки това, най-долния ред е, че в Java API колекции в никакъв случай не е най-доброто решение за всичко свързано с колекциите. Той трябва да се разшири и да го насърчава.

Разбира се, някои от решенията ще се разшири категорията на "висока мощност", като например тези, които се появиха в пакета на java.util.concurrent. Въпреки това, други разширения може да бъде доста прости - например, за написването на потребителски алгоритъм или просто разширяване на съществуващия клас Collection.

Разширяване API Java колекции може да изглежда изключително трудно, обаче, започва да направите това, вие ще откриете, че това не е толкова трудно, колкото си мислиш.

В заключение

Както сериализация API, Java API колекция е пълен с нюанси, така че да не се затвори тази тема. В следващата статия в тази серия са 5 неща, които ще разказват повече за пет начини да получите повече от API Java колекции.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!