Java osnove — obavezna štiva za intervju, verzija za napametovanje🍉
Koje su karakteristike jezika Java?
- Java je čisto objektno-orijentisani jezik. Može direktno da odražava objekte iz stvarnog života.
- Nezavisna je od platforme. Java koristi Java virtuelnu mašinu (JVM) za izvršavanje bajtkoda — bez obzira da li se Java program kompajlira na Windows, Linux ili MacOS, kompajlirani program može da se pokrene na drugim platformama.
- Java je interpretirani jezik: kompajler prevodi Java kôd u intermedijalni kôd nezavisan od platforme, koji se zatim interpretira i izvršava na JVM-u, što daje odličnu prenosivost.
- Java pruža mnoge ugrađene biblioteke: podršku za višenitno programiranje, podršku za mrežne komunikacije, a najvažnije — pruža sakupljač otpada (garbage collector).
- Java ima dobru bezbednost i robusnost. Pruža obradu izuzetaka i mehanizam sakupljanja otpada, i uklanja teško razumljive pokazivače iz C++-a.
Koja je razlika između JDK-a i JRE-a?
- JDK: Java Development Kit (alat za razvoj na Javi), pruža i razvojno i izvršno okruženje za Javu.
- JRE: Java Runtime Environment, pruža okruženje potrebno za izvršavanje Java programa.
- JDK sadrži JRE. Ako samo pokrećete Java programe, dovoljno je instalirati JRE. Za pisanje Java programa potrebno je instalirati JDK.
Ukratko o osnovnim tipovima podataka u Javi
- bajt: zauzima 1 bajt, opseg vrednosti -128 ~ 127
- short: zauzima 2 bajta, opseg -215 ~ 215-1
- int: zauzima 4 bajta, opseg -231 ~ 231-1
- long: zauzima 8 bajtova
- float: zauzima 4 bajta
- double: zauzima 8 bajtova
- char: zauzima 2 bajta
- boolean: veličina se razlikuje u zavisnosti od implementacije virtuelne mašine
Ukratko o automatskom boksovanju i unboksovanju
Za svaki osnovni tip podataka u Javi postoji odgovarajuća klasa omotač (wrapper).
Boksovanje je automatska konverzija osnovnog tipa u tip omotač, npr. int -> Integer.
Unboksovanje je automatska konverzija tipa omotač u osnovni tip, npr. Integer -> int.
Ukratko o pristupnim modifikatorima u Javi
- default: podrazumevani pristupni modifikator, vidljiv unutar istog paketa.
- private: vidljiv unutar iste klase, ne može da modifikuje klase.
- protected: vidljiv za klase u istom paketu i za sve podklase, ne može da modifikuje klase.
- public: vidljiv za sve klase.
Redosled inicijalizacije: konstruktor, inicijalizacija promenljivih instanci i statičkih promenljivih?
Redosled: statičke promenljive, promenljive instanci, konstruktor.
Detaljan redosled: statičke promenljive roditeljske klase, statički blok roditeljske klase, statičke promenljive podklase, statički blok podklase, nestatičke promenljive roditeljske klase, nestatički blok roditeljske klase, konstruktor roditeljske klase, nestatičke promenljive podklase, nestatički blok podklase, konstruktor podklase.
Redosled izvršavanja blokova koda u Javi
- statički blok roditeljske klase (izvršava se samo jednom)
- statički blok podklase (izvršava se samo jednom)
- konstrukcijski blok roditeljske klase
- konstruktor roditeljske klase
- konstrukcijski blok podklase
- konstruktor podklase
- običan blok
Tri glavne karakteristike objektno-orijentisanog programiranja?
Nasleđivanje: nova klasa može da se izvede iz postojeće klase; izvedena klasa nasleđuje metode i promenljive instanci iz svoje bazne klase, a može i da izmeni ili doda nove metode kako bi bolje odgovarala specifičnim potrebama.
Enkapsulacija: objektivne stvari se apstrahuju u klase; svaka klasa može da dozvoli svoje podatke i metode samo poverljivim klasama ili objektima, dok za nepoverljive vrši sakrivanje informacija.
Polimorfizam: dozvoljava objektima različitih klasa da odgovore na istu poruku. Različiti objekti koji pozivaju istu metodu, čak i sa istim parametrima, mogu na kraju da se ponašaju različito.
Zašto Java ne podržava višestruko nasleđivanje?
Da bi struktura programa bila jasnija i time lakša za održavanje. Pretpostavimo da Java podržava višestruko nasleđivanje: klasa C nasleđuje klase A i B; ako i A i B imaju sopstvenu metodu f(), poziv f() na klasi C u kôdu stvorio bi dvosmislenost.
Java posredno podržava višestruko nasleđivanje implementacijom više interfejsa. Pošto interfejs sadrži samo definicije metoda, a ne i njihove implementacije, kada klasa C nasleđuje interfejs A i interfejs B — čak i ako oba imaju metod f() — metod se ne može direktno pozvati; potrebno je implementirati konkretan f() da bi se pozvao, pa nema dvosmislenosti.
Višestruko nasleđivanje bi zakomplikovalo konverziju tipova i redosled poziva konstruktora, što bi uticalo na performanse.
Ukratko o polimorfizmu u Javi
Polimorfizam u Javi se deli na polimorfizam u vreme kompajliranja i polimorfizam u vreme izvršavanja.
Polimorfizam u vreme kompajliranja se uglavnom odnosi na preopterećenje metoda — razlikovanje metoda na osnovu različitih lista parametara.
Polimorfizam u vreme izvršavanja se uglavnom odnosi na to da se pri nasleđivanju roditeljske klase ili implementaciji interfejsa referenca roditeljske klase može usmeriti na objekat podklase.
Realizacija polimorfizma u vreme izvršavanja: uglavnom se oslanja na tabelu metoda. U tabeli se prvo nalaze metode klase Object, zatim metode roditeljske klase, a na kraju metode same klase. Ako podklasa prepisuje metodu roditeljske klase, te istoimene metode podklase i roditeljske klase dele jedan ulaz u tabeli metoda i računaju se kao metoda roditeljske klase. Zato je polimorfizam u vreme izvršavanja moguć.
Koji mehanizmi polimorfizma postoje u Javi?
Java pruža dva mehanizma za polimorfizam: preopterećenje i prepisivanje.
Preopterećenje (overload): više metoda istog imena u istoj klasi, ali sa različitim parametrima; već u vreme kompajliranja se može odrediti koja metoda se poziva.
Prepisivanje (override): podklasa prepisuje metodu bazne klase; kada se referenca bazne klase usmeri na instancu njene podklase, ili referentna promenljiva interfejsa na instancu klase koja ga implementira, tokom izvršavanja se — na osnovu konkretnog objekta na koji referenca ukazuje — poziva metod upravo tog objekta koji se izvršava, odnosno metod se određuje tek u vreme izvršavanja.
Razlika između preopterećenja i prepisivanja?
- Prepisivanje je odnos između roditeljske klase i podklase — vertikalni odnos; preopterećenje je odnos između metoda unutar iste klase — horizontalni odnos.
- Prepisivanje povezuje jednu ili jedan par metoda; preopterećenje povezuje više metoda.
- Prepisivanje zahteva iste liste parametara; preopterećenje zahteva različite liste parametara.
- Kod prepisivanja se telo pozvane metode određuje prema tipu objekta, dok se kod preopterećenja telo metode bira na osnovu slaganja stvarnih i formalnih parametara pri pozivu.
- Preopterećena metoda može da promeni tip povratne vrednosti; prepisana metoda ne može da promeni tip povratne vrednosti.
Šta je zajedničko, a u čemu se razlikuju interfejs i apstraktna klasa?
Zajedničko:
- Ni jedni ni druge ne mogu da se instanciraju.
- Klasa koja implementira interfejs ili podklasa apstraktne klase mora implementirati odgovarajuće metode da bi se instancirala.
Razlike:
Interfejs sadrži samo definicije metoda, bez implementacija, dok apstraktna klasa može imati i definicije i implementacije metoda.
Ključna reč za implementaciju interfejsa je implements, a za nasleđivanje apstraktne klase extends. Klasa može implementirati više interfejsa, ali može naslediti samo jednu apstraktnu klasu.
Kada između podklase i roditeljske klase postoji logička hijerarhija, preporučuje se apstraktna klasa, jer pogoduje akumulaciji funkcionalnosti. Kada funkcionalnost to ne zahteva, a želite da podržite specifične interakcije između dva ili više prilično različitih objekata, preporučuje se interfejs. Interfejs smanjuje spregnutost (coupling) sistema i olakšava kasnije održavanje, dodavanje ili uklanjanje metoda.
Ukratko o razlici između apstraktne klase i interfejsa
Apstraktna klasa: izražava odnos "je" (is-a) — na primer, pošto je čovek (man) osoba (person), person se može definisati kao apstraktna klasa.
Interfejs: izražava odnos "može" (can) i služi kao šablon. Na primer, zadamo interfejs fly, koji mogu implementirati i klasa Plane i klasa Bird.
Klasa može naslediti samo jednu apstraktnu klasu, ali može implementirati više interfejsa.
Ukratko o unutrašnjim klasama i njihovoj ulozi
- Unutrašnja klasa članica: unutrašnja klasa koja je član instance. Može pristupati atributima i metodama spoljašnje klase nivoa private i višeg. Kada spoljašnja klasa želi da pristupi atributima ili metodama unutrašnje klase, mora napraviti objekat unutrašnje klase i zatim preko njega pristupiti tim atributima ili metodama. Spoljašnja klasa može pristupiti i atributima unutrašnje klase modifikovanim sa private.
- Lokalna unutrašnja klasa: unutrašnja klasa koja postoji unutar metode. Prava pristupa su joj slična lokalnim promenljivama; može pristupiti samo final promenljivama spoljašnje klase.
- Anonimna unutrašnja klasa: koristi se samo jednom, nema ime klase, može pristupiti samo final promenljivama spoljašnje klase.
- Statička unutrašnja klasa: slična je statičkoj promenljivoj članu klase.
Koja je uloga ključne reči static u Javi?
Glavne uloge static-a su dve:
- Dodeljuje određenom tipu podataka ili objektu jedinstven prostor za skladištenje, nezavisan od broja kreiranih objekata.
- Povezuje metod ili atribut sa klasom, a ne sa objektom — dakle, metod se može pozvati direktno preko klase ili atribut klase koristiti bez kreiranja objekta.
Konkretno, static se može koristiti na četiri načina:
- Modifikacija promenljivih članova. Statička promenljiva modifikovana sa static ima samo jednu kopiju u memoriji. Čim se klasa koja sadrži statičku promenljivu učita, dodeljuje joj se prostor; može se koristiti preko "Klasa.statičkaPromenljiva" i "objekat.statičkaPromenljiva".
- Modifikacija metoda članova. Metod modifikovan sa static može se pozvati bez kreiranja objekta. U static metodi ne mogu se koristiti ključne reči this i super, ne može pozivati ne-static metode, i može pristupati samo statičkim promenljivama i statičkim metodama klase kojoj pripada.
- Modifikacija bloka koda. JVM izvršava static blok prilikom učitavanja klase. static blok se često koristi za inicijalizaciju statičkih promenljivih i izvršava se samo jednom.
- Modifikacija unutrašnje klase. static unutrašnja klasa može se instancirati bez instance spoljašnje klase. Statička unutrašnja klasa ne može imati isto ime kao spoljašnja klasa, ne može pristupiti običnim promenljivama članovima, već samo statičkim članovima i statičkim metodama spoljašnje klase.
Zašto je String projektovan kao nepromenljiv?
- Ušteda prostora: konstante niski se čuvaju u JVM-ovom bazenu niski (string pool) i mogu se deliti.
- Veća efikasnost: String mogu deliti različite niti i bezbedan je za niti (thread-safe); u višenitnim operacijama nije potrebna sinhronizacija.
- Bezbednost: String se često koristi za korisničko ime, lozinku, ime fajla i sl.; pošto je nepromenljiv, izbegava se da hakeri zlonamerno izmene.
Ukratko o String, StringBuffer i StringBuilder
Klasa String čuva nisku u nizu karaktera modifikovanom sa final, pa je zato nepromenljiva. Ako se objekat tipa String menja, potrebno je napraviti novi objekat u koji će se smestiti i stari i novi karakteri.
StringBuilder čuva podatke u nizu karaktera bez final, pa je promenljiv, ali nije bezbedan za niti.
StringBuffer takođe čuva podatke u nizu karaktera bez final; može se shvatiti kao StringBuilder koji je bezbedan za niti.
Razlika između operatora == i metode equals?
== poredi reference, equals poredi sadržaj.
Ako je promenljiva osnovnog tipa, == poredi da li su njene vrednosti jednake. Ako promenljiva ukazuje na objekat, == poredi da li dva objekta ukazuju na isti prostor za skladištenje.
equals je jedna od metoda klase Object. Pošto svaka Java klasa nasleđuje klasu Object, svaki objekat ima metod equals. equals definisan u klasi Object interno direktno poziva == za poređenje objekata. Ali prepisivanjem metode može se postići da poredi sadržaj podataka, a ne reference.
Ukratko o najčešće korišćenim metodama klase Object
- hashCode: heš-kôd izračunat iz objekta. Koristi se u mapama ili u metodi equals. Mora se garantovati da višestruki pozivi te metode nad istim objektom uvek vrate isti celobroj.
- equals: utvrđuje da li su dva objekta ista. Mora se garantovati da objekti za koje equals vraća true imaju i isti hashCode.
- toString: predstavlja objekat putem niske.
- clone: duboko kopira objekat.
Kako se u Javi deklarišu jednodimenzionalni i dvodimenzionalni nizovi?
Deklaracija jednodimenzionalnog niza:
type arrayName[]
type[] arrayNameDeklaracija dvodimenzionalnog niza:
type arrayName[][]
type[][] arrayName
type[] arrayName[]gde je type osnovni tip podataka ili klasa, a arrayName ime niza.
Ukratko o podeli izuzetaka u Javi
Java izuzeci se dele na Error (greške koje program ne može da obradi) i Exception (izuzetke koje sam program može da obradi). Obe klase nasleđuju Throwable.
Najčešći Error-i su StackOverFlowError, OutOfMemoryError i sl.
Exception se deli na izuzetke u vreme izvršavanja (runtime) i one van njega. Izuzetke u vreme izvršavanja možete obraditi try-catch, ali i ne morate. Ne-runtime izuzetke je obavezno obraditi; bez obrade program ne može proći kompajliranje.
Razlika između throw i throws
throw se uglavnom koristi unutar tela metode; programer njime definiše da se, kada neki iskaz naiđe na problem, aktivno baci izuzetak.
throws se uglavnom koristi u deklaraciji metode i predstavlja listu izuzetaka koje metod može da baci.
Da li će finally blok u Java programu sigurno biti izvršen?
U sledećim situacijama neće biti izvršen:
- Kada program naiđe na izuzetak pre nego što uđe u try blok, odmah se završava.
- Kada se program u try bloku prinudno završi, npr. pomoću System.exit(0), takođe se ne izvršava kôd u finally bloku.
U ostalim slučajevima, kada se izvršava try/catch/finally: try blok se izvršava prvi; ako nastupi izuzetak, catch i finally ga obrade i program se završava; ako nema izuzetka, nakon izvršavanja kôda u finally, nastavlja se sa narednim kôdom. Važno je napomenuti: kada try/catch blok sadrži return, kôd u finally bloku izvršava se pre return-a. Ako try/catch/finally blokovi sadrže return, return u finally bloku prepisuje return iz try/catch blokova.
Koja je razlika između final, finally i finalize?
- final se koristi za deklaraciju atributa, metoda i klasa, i označava redom: atribut je nepromenljiv, metod se ne može prepisivati, klasa se ne može naslediti.
- finally je deo obrade izuzetaka i može se koristiti samo u okviru try/catch; finally nosi blok koji ukazuje da će taj iskaz na kraju sigurno biti izvršen, pa se često koristi kada treba osloboditi resurse.
- finalize je metod klase Object koji sakupljač otpada poziva nad objektom koji se prikuplja. Kada se sakupljač otpada sprema da oslobodi prostor koji objekat zauzima, najpre poziva finalize(), a stvarno oslobađanje memorije tog objekta dešava se pri sledećoj akciji sakupljanja otpada.
Ukratko o generičkim tipovima (generics)
Generički tip, odnosno "parametrizovani tip", rešava problem nepoznatog konkretnog tipa objekta. Deluje u fazi kompajliranja. Pri korišćenju generičkih tipova tip podataka nad kojim se radi navodi se kao parametar; takav parametarski tip u klasi se zove generička klasa, u interfejsu generički interfejs, a u metodi generički metod.
Ukratko o brisanju generičkih tipova (type erasure)
Bajtkôd koji generiše Java kompajler ne sadrži informacije o generičkim tipovima — informacija o generičkom tipu se briše tokom obrade pri kompajliranju; taj proces se naziva brisanje generičkih tipova (type erasure).
Ukratko o anotacijama
Java anotacije služe da Java kôdu pruže metapodatke. Kao metapodaci, anotacije ne utiču neposredno na izvršavanje kôda, mada neke vrste anotacija to zapravo mogu da rade.
Mogu se koristiti da se kompajleru pruže informacije, da se u fazi kompajliranja softveru pruže informacije za odgovarajuću obradu, ili da se u vreme izvršavanja piše odgovarajući kôd i vrše odgovarajuće akcije.
Ukratko o metaanotacijama
Metaanotacija se može shvatiti kao anotacija nad anotacijom — koristi se unutar anotacije da ostvari željenu funkcionalnost. Deli se na:
- @Retention: označava u kojoj fazi anotacija opstaje — u izvornom kôdu, u bajtkôdu (učitavanje klase) ili u vreme izvršavanja (u JVM-u).
- @Target: označava oblast na koju se anotacija odnosi.
- @Documented: elemente anotacije uključuje u Javadoc.
- @Inherited: ako anotaciju koja je označena @Inherited koristimo na roditeljskoj klasi, a njena podklasa nije modifikovana drugim anotacijama, podklasa nasleđuje anotaciju roditeljske klase.
- @Repeatable: anotacija modifikovana ovom metaanotacijom može se više puta primeniti na isti objekat, pri čemu svaka primena može da nosi različito značenje.
Ukratko o Class objektu u Javi
U Javi objekti se dele na instance objekata i Class objekte; svaka klasa ima po jedan Class objekat koji sadrži informacije o toj klasi.
Načini dobijanja Class objekta:
Class.forName("puno kvalifikovano ime klase")
objekatInstance.getClass()
imeKlase.classŠta je mehanizam refleksije u Javi?
Mehanizam refleksije u Javi znači da tokom izvršavanja programa možete da napravite objekat bilo koje klase, da dobijete promenljive članove i metode članove bilo koje klase, da saznate informacije o klasi kojoj neki objekat pripada, i da pozovete atribute i metode bilo kog objekta. Refleksija daje Javi sposobnost da dinamički pribavlja informacije o programu i dinamički poziva metode objekata. Refleksioni API se poziva preko sledećih klasa:
- Klasa Class: omogućava dobijanje atributa i metoda klase.
- Klasa Field: omogućava dobijanje promenljivih članova klase.
- Klasa Method: omogućava dobijanje informacija o metodama klase.
- Klasa Constructor: omogućava dobijanje informacija o konstruktoru klase i sl.
Šta je serijalizacija?
Serijalizacija je proces pretvaranja objekta u niz bajtova; služi za rešavanje problema koji nastaju pri čitanju i pisanju nad tokom objekata. Serijalizacijom se stanje objekta zapisuje u tok radi prenosa putem mreže, ili se čuva u fajl, bazu i sl., a po potrebi se taj tok pročita i ponovo rekonstruiše u isti takav objekat.
Ukratko o realizaciji serijalizacije i deserijalizacije u Javi
Serijalizacija: Java objekat se pretvara u niz bajtova, pa se tako objekat može prenositi putem mreže.
Deserijalizacija: niz bajtova se pretvara u Java objekat.
Konkretna realizacija: implementirati interfejs Serializable, ili implementirati metode writeExternal() i readExternal() iz interfejsa Externalizable.
Ukratko o List u Javi
List je uređen red; u Javi se realizuje na dva načina:
ArrayList je realizovan preko niza; to je lista promenljivog kapaciteta i nije bezbedna za niti. Slučajni pristup je brz; kada se skup širi, kreira se veći niz i originalni niz se kopira u novi.
LinkedList je u suštini dvostruko povezana lista; u poređenju sa ArrayList-om, brže umeće i briše, ali je slučajni pristup elementima spor.
Koje su osnovne strukture podataka bezbedne za niti u Javi
- HashTable: verzija heš tabele bezbedna za niti, niske efikasnosti.
- ConcurrentHashMap: verzija heš tabele bezbedna za niti, visoke efikasnosti; služi kao zamena za HashTable.
- Vector: ArrayList bezbedan za niti.
- Stack: verzija steka bezbedna za niti.
- BlockingQueue i njegove podklase: red bezbedan za niti.
Ukratko o Set u Javi
Set je skup — struktura podataka koja ne dozvoljava ponavljanje elemenata i nije uređena. Java Set realizuje na tri načina:
HashSet je realizovan preko HashMap-a: ključ HashMap-e je element koji HashSet čuva, a za vrednost sistem koristi sopstvenu konstantu tipa Object imena PRESENT. Pri proveri jednakosti elemenata prvo se porede hashCode-ovi, a zatim, ako su jednaki, koristi se equals; pretraga je O(1).
LinkedHashSet nasleđuje HashSet i realizovan je preko LinkedHashMap-a; dvostruko povezana lista održava redosled umetanja elemenata.
TreeSet je realizovan preko TreeMap-a, a osnovna struktura podataka je crveno-crno stablo. Pri dodavanju elementa u skup, on se po pravilima poređenja umeće na odgovarajuće mesto, čime se obezbeđuje da skup i nakon umetanja ostane uređen. Pretraga je O(log n).
Ukratko o HashMap u Javi
Pre JDK8 realizacija je bila niz + povezana lista; JDK8 je promenio na niz + povezana lista / crveno-crno stablo. Glavne promenljive članice su: niz table za čuvanje podataka, broj elemenata size i faktor opterećenja loadFactor. U HashMap-i podaci postoje u obliku parova ključ-vrednost; heš vrednost ključa služi za izračunavanje indeksa u nizu. Ako dva elementa imaju isti hash ključa, nastaje heš kolizija i smeštaju se na istu povezanu listu.
Niz table čuva podatke HashMap-e; svaki indeks odgovara jednoj povezanoj listi, i svi podaci sa heš kolizijom smeštaju se na istu listu. Node/Entry čvor sadrži četiri promenljive člana: key, value, pokazivač next i hash vrednost. Od JDK8, kada povezana lista pređe 8, pretvara se u crveno-crno stablo.
Ako je odnos trenutnog broja podataka i ukupnog kapaciteta veći od faktora opterećenja, HashMap izvršava proširenje. Podrazumevani inicijalni kapacitet je 16, kapacitet pri proširenju mora biti stepen dvojke, maksimalni kapacitet je 1 << 30, a podrazumevani faktor opterećenja je 0.75.
Zašto HashMap nije bezbedan za niti
U JDK1.7 HashMap umeće elemente na početak liste (head insert), pa u konkurentnim uslovima to dovodi do kružne liste i beskonačne petlje.
Iako je JDK1.8 usvojio umetanje na kraj liste (tail insert) i time rešio taj problem, put operacija pod konkurentnošću i dalje može dovesti do toga da prethodni ključ bude prepisan narednim.
Pošto HashMap ima mehanizam proširenja, može se desiti i da nit A izvrši proširenje, a da nit B zatim pogreši pri get metodi.
Ukratko o TreeMap u Javi
TreeMap je Map struktura realizovana preko crveno-crnog stabla; osnova je balansirano sortirano binarno stablo. Pošto su vremenske složenosti umetanja, brisanja i obilaska crveno-crnog stabla O(log N), performanse su niže nego kod heš tabele. Ali heš tabela ne može da pruži uređen ispis parova ključ-vrednost, dok crveno-crno stablo može da ispiše parove uređeno prema veličini ključa.
Šta je zajedničko, a u čemu se razlikuju ArrayList, Vector i LinkedList?
- ArrayList, Vector i LinkedList su svi proširivi nizovi, odnosno nizovi čija se dužina može dinamički menjati.
- I ArrayList i Vector se zasnivaju na Object[] nizu koji čuva elemente; u memoriji rezervišu neprekidan prostor za čuvanje i podržavaju pristup preko indeksa. Međutim, pri umetanju elemenata može biti potrebno pomeriti elemente u kontejneru, pa je efikasnost umetanja niža. Kada broj elemenata pređe inicijalni kapacitet, i ArrayList i Vector vrše proširenje.
- Vector je bezbedan za niti; većina njegovih metoda je direktno ili indirektno sinhronizovana. ArrayList nije bezbedan za niti — njegove metode nisu sinhronizovane. Ni LinkedList nije bezbedan za niti.
- LinkedList je realizovan kao dvostruko povezana lista; indeksiranje podataka zahteva obilazak od početka, pa je slučajni pristup manje efikasan. Pri umetanju elemenata, međutim, ne zahteva se pomeranje podataka, pa je umetanje efikasnije.
Koja je razlika između HashMap i Hashtable?
- HashMap je laganija realizacija u odnosu na Hashtable; HashMap dozvoljava da key i value budu null, ali najviše jedan zapis sme imati key jednak null, dok Hashtable to ne dozvoljava.
- Metode u Hashtable su bezbedne za niti, a u HashMap-i nisu. Pri višenitnom pristupanju HashMap-i potrebno je obezbediti dodatni mehanizam sinhronizacije.
- Hashtable se obilazi preko Enumeration-a, a HashMap preko Iterator-a.
Kako odlučiti — HashMap ili TreeMap?
Ako se češće umeće, briše ili pronalazi jedan element u mapi, HashMap je bolji izbor. Ako je potrebno uređeno obilaziti skup ključeva, TreeMap je bolji izbor.
Koja je veza između equals i hashCode u HashSet-u?
Metode equals i hashCode se nasleđuju iz klase Object. equals uglavnom služi da proveri da li reference na memorijske adrese objekata ukazuju na istu adresu; hashCode prema definisanim heš pravilima pretvara memorijsku adresu objekta u heš kôd. Elementi u HashSet-u se ne smeju ponavljati, pa se jednakost sačuvanih objekata proverava uglavnom pomoću hashCode i equals:
- Ako dva objekta imaju različite hashCode vrednosti, objekti nisu isti.
- Ako dva objekta imaju isti hashCode, zatim se poziva equals; ako equals vrati true, objekti su isti, inače nisu.
Koja je razlika između fail-fast i fail-safe iteratora?
- fail-fast radi direktno nad kontejnerom; tokom obilaska, čim otkrije da su podaci u kontejneru izmenjeni, odmah baca ConcurrentModificationException, što dovodi do neuspelog obilaska. Tipični kontejneri koji koriste fail-fast su HashMap, ArrayList i sl.
- fail-safe obilazak se zasniva na klonu kontejnera, pa izmena sadržaja kontejnera ne utiče na obilazak. Tipični kontejneri koji se obilaze na fail-safe način su ConcurrentHashMap i CopyOnWriteArrayList.
Koja je razlika između Collection i Collections?
- Collection je interfejs za skupove; pruža opšte metode interfejsa za osnovne operacije nad objektima skupa, a svi skupovi su njegove podklase, npr. List, Set i sl.
- Collections je klasa omotač koja sadrži mnoge statičke metode i ne može se instancirati; koristi se kao klasa alatka — npr. metod za sortiranje Collections.sort(list), odnosno metod za obrtanje redosleda Collections.reverse(list).
Autor priloga: Houduan Jishu Xiaoniu Shuo Izvorni link: https://mp.weixin.qq.com/s/PmeH38qWVxyIhBpsAsjG7w
