1
Колекције
у програмском језику Јава
Предавач: Дражен Драшковић
Контакт: [email protected]
Електротехнички факултет
у Београду
2
Колекције - Collection
• У уграђеном Јавином пакету java.util налази се
много веома корисних класа и интерфејса
• Јавин collections фрејмворк стандардизује начин
на који су групе објеката обрађиване од стране
програма
• Јако ефикасан
• Разне врсте колекција раде на исти начин
• Итератори, који се налазе у оквиру овог
фрејмворка стандардизује начин на који се
приступа објектима колекција
3
Мапе - Maps
• Поред колекција, фрејмворк дефинише и
неколико интерфејса и класа мапа.
Мапе складиште објекте типа кључ / вредност.
• Кључ/вредност је пар који се још зове и улаз мапе
• Кључ мора бити јединствен на нивоу једне мапе
• Мапе нису део колекција, али су уско повезане са њима
• Могуће је претворити мапе у неку од колекција и даље
манипулисати са том колекцијом
• Мапе су врло корисне уколико желите да претражујете
по кључу и да вршите ажурирања и брисања елемената
4
Колекције - хијерархија
Collection
Set List
SortedSet HashSet
TreeSet
ArrayList
LinkedList
LinkedHashSet
5
Колекције - итератор
Iterator
ListIterator
6
Пример - примена итератора
import java.util.*;
class PrimerIteratora{
public static void main(String args[]){
ArrayList<String> lista=new ArrayList<String>(); //nova lista
lista.add("Drazen"); //dodajemo objekte u listu
lista.add("Marko");
lista.add("Uros");
lista.add("Filip");
//prolazak kroz listu sa iteratorom
Iterator itr=lista.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
7
Пример - коришћење foreach
import java.util.*;
class PrimerBezIteratora{
public static void main(String args[]){
ArrayList<String> novalista=new ArrayList<String>();
novalista.add("Drazen");
novalista.add("Filip");
novalista.add("Uros");
novalista.add("Marko");
for(String asistent:novalista)
System.out.println(asistent);
}
}
8
Колекције - Мапе
Map
SortedMap HashMap
TreeMap
9
Колекције - Collection
• Collection је корени интерфејс за колекције.
Обезбеђује разне методе за рад са колекцијама.
• Додаје нови елемент/е у колекцију
boolean add(Object obj)
boolean addAll(Collection c)
• Узима објекат/те из колекције
boolean remove(Object obj)
boolean removeAll(Collection c)
• Враћа итератор за ту колекцију
Iterator iterator( )
• Враћа низ који садржи све објекте колекције, објекти су
копије објеката у који се налазе у колекцији
Object[ ] toArray( )
9
10
Колекције - Collection
• Све методе у интерфејсу манипулишу са
подацима типа Object.
• Како је Object надкласа свих класа у Јави,
било који објекат се може сместити у колекцију.
• Примитивни типови не могу да се сместе у колекције.
10
11
Колекције - Set
• Set - Колекција у којој не постоји могућност
постојања елемената дупликата и чији се
елементи не морају чувати неким одређеним
редоследом
• SortedSet - сет чији су елементи уређени
• HashSet - конретна имплементација неуређеног сета
преко хеш табеле
• TreeSet class - имплементира сет интерфејс користећи
стабло за смештање података
• LinkedHashSet class - имплементација листе објеката
преко повезаних уноса у хеш табелу
11
12
Колекције - List
• List - Колекција чији елеметни представљају
листу елемената, најчешће уређена на неки
начин
• ArrayList - имплементације која представља низове
који могу динамички да расту
• LinkedList - имплементација која представља
уланчану листу
12
13
Пример са листама (1)
import java.util.*;
class Knjiga {
int id;
String naziv, autor, izdavac;
int kolicina;
public Knjiga(int id, String naziv, String autor, String izdavac,
int kolicina) {
this.id = id;
this.naziv = naziv;
this.autor = autor;
this.izdavac = izdavac;
this.kolicina = kolicina;
}
}
13
14
Пример са листама (2)
public class ArrayListExample {
public static void main(String[] args) {
List<Knjiga> lista=new ArrayList<Knjiga>(); //pravimo listu knjiga
Knjiga k1=new Knjiga(101,"Na Drini cuprija","Ivo Andric","SKZ", 8);
Knjiga k2=new Knjiga(102,"Tvrdjava","Mesa Selimovic","Stubovi", 4);
Knjiga k3=new Knjiga(103,"Roman o Londonu","Milos Crnjanski","GecaKon", 6);
//dodavanje knjiga
lista.add(k1);
lista.add(k2);
lista.add(k3);
//foreach petlja
for(Knjiga k:lista){
System.out.println(k.id + “ ” + k.naziv + “ ” + k.autor + “ ” +
k.izdavac + “ ” + k.kolicina);
}
}
}
14
Листа је уређена секвенца елемената
Скуп је неуређен и сваки елемент је
јединствен
15
Поређење: листе и скупови (Set)
15
Сви имплементирају интерфејс List и слично се
употребљавају
Главна разлика у имплементацији и перформансама
ArrayList – имплементира листу као низ чија величина може
да се мења, па можемо дохватати елементе са методама
get/set
LinkedList – имплементира се као двоструко уланчана листа,
њене перформансе у додавању и уклањању елемената су
боље од ArrayList, али су горе у коришћењу get/set метода
Vector – сличан као ArrayList, али је синхронизован. Са друге
стране, ArrayList је бољи избор, ако желимо сигуран програм
са нитима (thread-safe program)
16
ArrayList vs LinkedList vs Vector (1)
16
Vector и ArrayList захтевају простор са повећањем
броја елемената у структури
Vector – удвостручује величину структуре сваки пут
ArrayList – сваки пут повећава структуру за 50% своје
величине
LinkedList имплементира Queue интерфејс који има
већи број метода него ArrayList и Vector
Пример: offer(), peek(), pool() и друге
Подразумевани почетни капацитет ArrayList је веома
мали, па је добра препорука да се та структура
одмах конструише са већим почетним капацитетом.
То може да избегне непотребни трошак за промену
величине структуре.
17
ArrayList vs LinkedList vs Vector (2)
17
18
ArrayList vs LinkedList (3)
ArrayList alst = new ArrayList();
alst.add(3);
alst.add(2);
alst.add(1);
alst.add(4);
alst.add(5);
alst.add(6);
alst.add(6);
Iterator iter1 = alst.iterator();
while(iter1.hasNext()){
System.out.println(iter1.next());
}
LinkedList llst = new LinkedList();
llst.add(3);
llst.add(2);
llst.add(1);
llst.add(4);
llst.add(5);
llst.add(6);
llst.add(6);
Iterator iter2 = llst.iterator();
while(iter2.hasNext()){
System.out.println(iter2.next());
}
Да ли се види разлика у коришћењу?
А у начину рада имплементације?
18
19
ArrayList vs LinkedList – перформансе
ArrayList LinkedList
Дохватање елем.:
get()O(1) O(n)
Дохватање новог:
add()O(1)
O(1)
amortized
Уклањање елемента:
remove()O(n) O(n)
ArrayList LinkedList
1 543 352 85 085 551
13 265 642 9 550 057
199 961 301 85 768 810
LinkedList – бржи за операције add и remove,
али доста спорији у операцији get
Избор шта користити: у зависности од комплексности
структуре
LinkedList одабрати када немамо велики број
приступа елементу и када имамо велики број
операција add / remove
Пример главних операција (time [ns])
19
20
Итератор - Iterator
• Iterator омогућава итерирање кроз колекције
• Враћа да ли постоји следећи елемент за итерирање
boolean hasNext ( )
• Враћа наредни елемент у итерацији
Object next ( )
• Уклања елемент који је итератор вратио као последњи,
користи се после позива методе next()
Object remove ( )
• Умеће објекат у листу испред елемента који ће бити
враћен следећим позивом next()
void add (Object obj)
20
21
Мапе - Maps
• Maps не наслеђује интерфејс као и остале колекције, због разлога што мапе складиште елементе као пар кључ / вредност (улаз)• Враћа да ли мапа има вредност под задатим кључем
boolean containsKey (Object key)
• Враћа да ли мапа садржи одређену вредностboolean containsValue (Object value)
• Враћа вредност која се налази под задатим кључемObject get (Object key)
• Складишти елемент у мапу, преписујући елемент који је можда постојао под тим кључем, уколико кључ није постоја пре тога враћа null у супротном објекат који је био под кључемObject put (Object key, Object value)void putAll (Map map) - убацивање мапе у мапу
21
22
Мапе - Maps
• Методе интерфејса Maps• Уклања објекат који се налази под кључем к
Object remove (Object k)
• Враћа број елемената у мапиint size ( )
• Конкретне имплементације HashMap, TreeMap• HashMap - класа која имплементира мап интерфејс
преко хаш табеле
• TreeMap - класа која имплементира интерфејс помоћу стабла, гарантује сортирање по узлазној вредности кључа, кључеви морају имплементирати Comparableинтерфејс (обезбеђује методу за компарацију)
22
23
Мапе - Пример
import java.util.*;
class MapPrimer{
public static void main(String args[]){
Map<Integer,String> nastavnici =
new HashMap<Integer,String>();
nastavnici.put(4000,"Bosko");
nastavnici.put(4001,"Drazen");
nastavnici.put(4002,"Sanja");
for(Map.Entry m:nastavnici.entrySet()){
System.out.println(m.getKey()+" "+m.getValue());
}
}
}Entry подинтерфејс од Map. Користимо Map.Entry у петљи да дохватимо
елементе помоћу getKey() и getValue().
23