Пређи на садржај

Јава цоллецтионс фрамеwорк

С Википедије, слободне енциклопедије
class- and interface hierarchy of java.util.Map

Java collections framework - JCF је скуп класа и интерфејсова који имплементирају често употребљиване колекције структура података.[1]

Историја

[уреди | уреди извор]

Имплементације колекција у верзијама Јаве пре ЈДК 1.2 су садржавале неколицину класа структура података, али не и .[2] Стандардни начини за груписање Јава објеката су били помоћу низова, Vector и Hashtable класа, које није било лако проширити.[3]

С обзиром на потребу за динамичнијим колекцијама структура података, развијене су многе независне библиотеке,[2] од којих су најкоришћеније биле Даг Лијев (Доуг Леа) Пакет колекција (Цоллецтионс пацкаге),[4] и ОбјецтСпаце Генериц Цоллецтион Либрарy (ЈГЛ),[5] чија је сврха била конзистентност са C++ Стандард Темплате Либрарy (СТЛ).[6]

ЈЦФ је развијен и дизајниран углавном од стране Џош Блока, и појавио се у ЈДК 1.2. Користи многе идеје и класе и Даг Лијевог Пакета колекција, који тада бива превазиђен.[4] Сун цхосе нот то усе тхе идеас оф ЈГЛ, бецаусе тхеy wантед а цомпацт фрамеwорк, анд цонсистенцy wитх C++ wас нот оне оф тхеир гоалс.[7]

Архитектура

[уреди | уреди извор]

Скоро све колекције насле]ују од java.util.Collection интерфејса, који дефинише основне делове сваке колекције. Интерфејс уводи адд() и ремове() методе за додавање и избацивање из колекције. Неопходни су и тоАрраy() метод, који преводи колекцију у низ који садржи све чланове колекције, и цонтаинс() метод који проверава да ли колекција садржи неки конкретан елемент. Овај интерфејс наслеђује од java.lang.Iterable интерфејса, чиме се омогућује обрада колекција помоћу фор-еацх израза. Све колекције имају итератор који пролази кроз све елементе у колекцији. Такође, Цоллецтион је генерички интерфејс - свака колекција може да буде написана тако да може да складишти било коју класу.[8]

Листе су имплементиране помоћу java.util.List интерфејса. Дефинише листу која је суштински фелксибилнија верзија низа. Елементи су уређени у специфичном редоследу и дозвољени су дупликати. Елементи се могу уметнути на специфичну позицију и могућа је претрага. Имплементиране су у класама java.util.ArrayList и java.util.LinkedList. АрраyЛист имплементира листу као низ. Када се користе функције специфичне за листе, класа помера елементе унутар низа. ЛинкедЛист складишти елементе у чворовима који имају показиваче на претходни и наредни елемент листе.[9]

Стек се имплементира помоћу java.util.Stack. Стацк класа представља ласт-ин-фирст-оут (ЛИФО) гомилу објеката која проширује Вецтор класу са пет операција које омогућавају вектору да буде третиран као стек. Снабдевени су уобичајени пусх и поп методи, али и метод за гледање садржаја на врху стека, метод који проверава да ли је стек празан и метод који претражује стек и открива колико је тражени објекат далеко од врха. Стек се креира празан.

Ред је структура података која складишти своје елементе у редоследу у којем су унешени. Имплементира се користећи интерфејс java.util.Queue. Елементи се додају на крај, а скидају са почетка, остварујући фирст-ин-фирст-оут систем. java.util.LinkedList, java.util.ArrayDeque, анд java.util.PriorityQueue имплементирају овај интерфејс. ЛинкедЛист имплементира и Лист интерфејс. АрраyДеqуе имплицитно имплементира ред помоћу низа.

java.util.concurrent.BlockingQueue је подинтерфејс java.util.Queue који омогућава флексибилније руковање редовима. Он дозвољава да се при стављању објекта у ред провери да ли има места и, уколико нема, да се сачека извесно време да се ослободи простор. Слично, уколико се скида елемент из празног реда, чека се док се не појави.[10]

Код java.util.PriorityQueue се елементи сортирају по приоритету који се одређује или помоћу цомпареТо() метода, или помоћу метода који се прослеђује конструктору реда са приоритетм. Ово се имплементира помоћу хипа.[11]

Ред са два краја

[уреди | уреди извор]

java.util.Deque интерфејс омогућава креирање двоструких редова. Док обични редови дозвољавају само додавање на крају и скидање са почетка, двоструки ред омогућава да се то врши са оба краја. Могу се креират итератори за оба смера. java.util.ArrayDeque и java.util.LinkedList имплементирају овај интерфејс.[12]

java.util.Set интерфејс дефинише скуп објеката. Скуп не може да садржи дупликате и нема конкретан поредак објеката. Елементима се не може приступати помоћу индекса. java.util.HashSet, java.util.LinkedHashSet, и java.util.TreeSet имплементирају java.util.Set. ХасхСет користи java.util.HashMap за складиштење елемената и хешева ради спречавања настанка дупликата. java.util.LinkedHashSet ово проширује креирањем двоструко повезане листе која повезује елементе у редоследу којим су унети у скуп, чиме се постиже то да је редослед итерирања кроз скуп предвидив. java.util.TreeSet користи црвено-црно стабло имплементирано помоћу java.util.TreeMap. Црвено-црно стабло се стара о томе да нема дупликата и омогућава ТрееСет-у да имплементира java.util.SortedSet.[13] java.util.SortedSet интерфејс имплементира java.util.Set интерфејс, али за разлику од обичног скупа његови елементи су сортирани или уз помоћ цомпареТо() методе елемента, или помоћу методе која је прослеђена конструктору сортираног скупа. Могу се повратити први и последњи елементи сортираног скупа, и могу се креирати подскупови скупа помоћу минималних и максималних вредности.

Мапе су просте структуре података које асоцирају вредности са кључевима. Ако је кључ хеш вредност елемента мапа је суштински скуп, а ако је само растући број постаје листа. У Јави су мапе дефинисане помоћу java.util.Map интерфејса. java.util.HashMap користи хеш табелу. Хешеви кључева се користе за проналажење вредности. java.util.LinkedHashMap ово проширује хеш мапу повезивањем елемената у двоструко повезану листу, што омогућава да се елементима приступа и по редоследу којим су додати у мапу. java.util.TreeMap за разлику од претходне две имплементације користи црно-црвено стабло где се кључеви користе као вредности чворова у стаблу, док чворови показују на вредности мапе.[14]


Проширења за ЈЦФ

[уреди | уреди извор]

Apache Commons Collections библиотека додаје типове колекција као што су џак (мултискуп) и двосмерна мапа. Такође омогућава креирање унија у пресека. .[15]

Гугл је објавио своје библиотеке колекција као део гуава библиотека.

Референце

[уреди | уреди извор]
  1. ^ „Lesson: Introduction to Collections”. Oracle Corporation. Приступљено 22. 12. 2010. 
  2. ^ а б „Java Collections Framework” (PDF). IBM. Архивирано из оригинала (PDF) 7. 08. 2011. г. Приступљено 01. 01. 2011. 
  3. ^ „Get started with the Java Collections Framework”. JavaWorld. 11. 01. 1998. Архивирано из оригинала 30. 03. 2010. г. Приступљено 1. 01. 2011. „'Before Collections made its most welcome debut, the standard methods for grouping Java objects were via the array, the Vector, and the Hashtable. All three of these collections have different methods and syntax for accessing members: arrays use the square bracket ([]) symbols, Vector uses the elementAt method, and Hashtable uses get and put methods.' 
  4. ^ а б Doug Lea. . „Overview of the collections Package”. Приступљено 1. 01. 2011. „'The Sun Java Development Kit JDK1.2 finally includes a standard set of collection classes. While there are some design and implementation differences, the JDK1.2 package contains most of the same basic abstractions, structure, and functionality as this package. For this reason, this collections package will NOT be further updated' 
  5. ^ „Generic Collection Library for Java™”. Архивирано из оригинала 12. 03. 2009. г. Приступљено 1. 01. 2011. 
  6. ^ . „Need a good set of abstract data structures? ObjectSpace's JGL packs a punch!”. JavaWorld. 6. 01. 1997. Архивирано из оригинала 02. 03. 2012. г. Приступљено 1. 01. 2011. „'As with Java itself, the Java Generic Library borrows heavily from the C++ camp: It takes the best from C++'s STL, while leaving the C++ warts behind. Most C++ programmers today will know of their STL, but few are managing to exploit its potential.' 
  7. ^ „The battle of the container frameworks: which should you use?”. JavaWorld. 1. 01. 1999. Архивирано из оригинала 12. 04. 2010. г. Приступљено 1. 01. 2011. „'Comparing ObjectSpace Inc.'s JGL and Sun's Collections Framework turns out to be like comparing apples and kiwi fruits. At first sight, the two frameworks seem to be competing for the same developers, but after a closer inspection it is clear that the two cannot be compared fairly without acknowledging first that the two frameworks have different goals. If, like Sun's documentation states, Collections is going to homogenize Sun's own APIs (core API, extensions, etc.), then clearly Collections has to be great news, and a good thing, even to the most fanatic JGL addict. Provided Sun doesn't break its promise in this area, I'll be happy to invest my resources in adopting Collections in earnest. ' 
  8. ^ „Iterable (Java Platform SE 7 )”. Docs.oracle.com. 6. 06. 2013. Приступљено 16. 08. 2013. 
  9. ^ „List (Java Platform SE 7 )”. Docs.oracle.com. 6. 06. 2013. Приступљено 16. 08. 2013. 
  10. ^ „BlockingQueue (Java Platform SE 7 )”. Docs.oracle.com. 6. 06. 2013. Приступљено 16. 08. 2013. 
  11. ^ „PriorityQueue (Java Platform SE 7 )”. Docs.oracle.com. 6. 06. 2013. Приступљено 16. 08. 2013. 
  12. ^ „Deque (Java Platform SE 7 )”. Docs.oracle.com. 6. 06. 2013. Приступљено 16. 08. 2013. 
  13. ^ „Set (Java Platform SE 7 )”. Docs.oracle.com. 6. 06. 2013. Приступљено 16. 08. 2013. 
  14. ^ „Map (Java Platform SE 7 )”. Docs.oracle.com. 6. 06. 2013. Приступљено 16. 08. 2013. 
  15. ^ „Collections - Home”. Commons.apache.org. 4. 07. 2013. Приступљено 16. 08. 2013. 

Спољашње везе

[уреди | уреди извор]