JDK 1.2 pristato naują objektų kolekcijų sistemą, vadinamą „Java Collections Framework“. "O ne, - dejuojate, - ne kitos API, ne kitos sistemos, kurią reikia išmokti!" Bet palaukite, kol atsisuksite, išgirskite mane: kolekcijų sistema verta jūsų pastangų ir bus naudinga jūsų programavimui daugeliu atžvilgių. Iš karto ateina į galvą trys dideli privalumai:
- Tai žymiai padidina jūsų kolekcijų įskaitomumą, pateikdamas standartinį sąsajų rinkinį, kurį daugelis programuotojų naudos daugelyje programų.
- Tai daro jūsų kodą lankstesnį, nes leidžia perduoti ir grąžinti sąsajas, o ne konkrečias klases, apibendrinant kodą, o ne užrakinant.
- Jis siūlo daugybę specifinių sąsajų įgyvendinimų, leidžiančių pasirinkti tinkamiausią kolekciją ir pasižymi aukščiausiu našumu jūsų poreikiams.
Ir tai tik pradedantiesiems.
Mūsų apžvalga sistemoje prasidės apžvelgiant privalumus, kuriuos ji teikia saugodama objektų rinkinius. Kaip netrukus sužinosite, nes jūsų seni darbiniai arkliukai „Hashtable“
ir Vektorius
palaikykite naująją API, jūsų programos bus vienodos ir glaustos - tai, ką jūs ir jūsų kodą pasiekiantys kūrėjai tikrai nudžiugins.
Po mūsų preliminarios diskusijos įsigilinsime į detales.
„Java“ kolekcijų privalumas: apžvalga
Prieš kolekcijos debiutą, standartiniai Java objektų grupavimo metodai buvo naudojami naudojant masyvą Vektorius
, ir „Hashtable“
. Visose trijose šiose kolekcijose yra skirtingi metodai ir sintaksė norint pasiekti narius: masyvuose naudojami laužtinio skliausto ([]) simboliai, Vektorius
naudoja elementAt
metodas ir „Hashtable“
naudoja gauti
ir įdėti
metodai. Šie skirtumai ilgą laiką vedė programuotojus link nenuoseklumo įgyvendinant savo kolekcijas - kai kurie mėgdžioja Vektorius
prieigos metodai, o kai kurie mėgdžioja Surašymas
sąsaja.
Kad būtų dar sudėtingiau, dauguma Vektorius
metodai pažymėti kaip galutiniai; tai yra, jūs negalite pratęsti Vektorius
klasei įgyvendinti panašaus tipo kolekciją. Galėtume sukurti kolekcijos klasę, kuri atrodytų kaip a Vektorius
ir elgėsi kaip a Vektorius
, bet jo nepavyko perduoti metodui, kuriam reikia a Vektorius
kaip parametrą.
Galiausiai nė viena kolekcija (masyvas, Vektorius
arba „Hashtable“
) įdiegia standartinę nario prieigos sąsają. Programuotojams kuriant algoritmus (panašius į rūšis), kad būtų galima manipuliuoti kolekcijomis, prasidėjo karštas diskursas, kokį objektą perduoti algoritmui. Ar turėtumėte perduoti masyvą ar a Vektorius
? Ar turėtumėte įdiegti abi sąsajas? Kalbėti apie dubliavimąsi ir painiavą.
Laimei, „Java Collections Framework“ pašalina šias problemas ir siūlo daugybę pranašumų, palyginti su nenaudojant jokios sistemos ar naudojant Vektorius
ir „Hashtable“
:
Tinkamas rinkimo sąsajų rinkinys
Įdiegę vieną iš pagrindinių sąsajų -
Kolekcija
,Nustatyti
,Sąrašas
arbaŽemėlapis
- jūs užtikrinate, kad jūsų klasė atitinka bendrą API ir tampa taisyklingesnė bei lengvai suprantama. Taigi, nesvarbu, ar diegiate SQL duomenų bazę, spalvų pavyzdžių atitikiklį ar nuotolinio pokalbio programą, jei įdiegiateKolekcija
sąsaja, jūsų objektų kolekcijos operacijos yra gerai žinomos jūsų vartotojams. Standartinės sąsajos taip pat supaprastina kolekcijų perdavimą ir grąžinimą į klasių metodus ir iš jų bei leidžia metodams dirbti su įvairesnėmis kolekcijomis.Pagrindinis rinkinių diegimo rinkinys
Be patikimų
„Hashtable“
irVektorius
, kurie buvo atnaujinti siekiant įgyvendintiKolekcija
sąsajų, buvo pridėta naujų kolekcijos diegimų, įskaitant„HashSet“
irMedžių rinkinys
,„ArrayList“
ir„LinkedList“
irHashMap
irŽemėlapis
. Naudojant esamą, įprastą diegimą, jūsų kodas yra trumpesnis ir greitesnis atsisiųsti. Be to, naudojant esamą „Core Java“ kodą, užtikrinama, kad bet kokie pagrindinio kodo patobulinimai taip pat pagerins jūsų kodo našumą.Kiti naudingi patobulinimai
Kiekviena kolekcija dabar pateikia
Iteratorius
, patobulintasSurašymas
leidžia atlikti elemento operacijas, tokias kaip įterpimas ir ištrynimas.Iteratorius
yra „greitai nepavykęs“, o tai reiškia, kad gausite išimtį, jei pakartotiną sąrašą pakeis kitas vartotojas. Be to, sąrašais pagrįstos kolekcijos, tokios kaipVektorius
grąžinti a„ListIterator“
kurie leidžia abipusį iteraciją ir atnaujinimą.Kelios kolekcijos (
Medžių rinkinys
irMedžio žemėlapis
) netiesiogiai palaiko užsakymą. Naudokite šias klases, kad išlaikytumėte rūšiuojamą sąrašą be jokių pastangų. Norėdami pagerinti didelių sąrašų našumą, galite rasti mažiausią ir didžiausią elementą arba atlikti dvejetainę paiešką. Galite rūšiuoti kitas kolekcijas pateikdami kolekcijos palyginimo metodą (aLyginamasis
objektas) arba objektų palyginimo metodas (Palyginamas
sąsaja).Galiausiai, statinė klasė
Kolekcijos
pateikia nekeičiamas (tik skaitomas) ir sinchronizuotas esamų kolekcijų versijas. Nepakeičiamos klasės padeda išvengti nepageidaujamų kolekcijos pakeitimų. Sinchronizuota kolekcijos versija yra būtinybė daugialypėms programoms.
Yra „Core Java“ dalis ir yra java.util.collections
JDK paketas 1.2. Ši sistema taip pat prieinama kaip JDK 1.1 paketas (žr. Ištekliai).
Pastaba: pavadinta kolekcijų JDK 1.1 versija com.sun.java.util.collections
. Turėkite omenyje, kad kodas, sukurtas naudojant 1.1 versiją, turi būti atnaujintas ir sukompiliuotas 1.2 versijos versijai, o jokių 1.1 versijoje serijuotų objektų negalima deserializuoti į 1.2.
Pažvelkime į šiuos privalumus atidžiau, naudodamiesi „Java Collections Framework“ naudodami tam tikrą savo kodą.
Gera API
Pirmasis „Java Collections Framework“ pranašumas yra nuosekli ir taisyklinga API. API yra koduojama pagrindiniame sąsajų rinkinyje, Kolekcija
, Nustatyti
, Sąrašas
arba Žemėlapis
. Kolekcija
sąsajoje yra pagrindinės rinkimo operacijos, tokios kaip narystės pridėjimas, pašalinimas ir testai (talpinimas). Bet koks rinkinio įgyvendinimas, nesvarbu, ar jį teikia „Java Collections Framework“, ar jūsų pačių kūriniai, palaikys vieną iš šių sąsajų. Kadangi rinkinių sistema yra taisyklinga ir nuosekli, jūs išmoksite didelę jų dalį tiesiog išmokdami šias sąsajas.
Tiek Nustatyti
ir Sąrašas
įgyvendinti Kolekcija
sąsaja. Nustatyti
sąsaja yra identiška Kolekcija
sąsaja, išskyrus papildomą metodą, į masyvą
, kuris paverčia a Nustatyti
į Objektas
masyvas. Sąrašas
sąsaja taip pat įgyvendina Kolekcija
sąsają, tačiau pateikia daugybę prieigų, kurie sąraše naudoja sveiko skaičiaus rodyklę. Pavyzdžiui, gauti
, pašalinti
ir rinkinys
visi ima skaičių, kuris turi įtakos indeksuojamam sąrašo elementui. Žemėlapis
sąsaja nėra gaunama iš kolekcijos, bet suteikia sąsają, panašią į java.util.Hashtable
. Raktai naudojami vertėms pateikti ir gauti. Kiekviena iš šių sąsajų aprašyta tolesniuose kodų pavyzdžiuose.
Šis kodo segmentas parodo, kaip atlikti daugelį Kolekcija
operacijos „HashSet“
, pagrindinė kolekcija, įgyvendinanti Nustatyti
sąsaja. A „HashSet“
yra tiesiog rinkinys, neleidžiantis pasikartojančių elementų ir neužsakantis ar išdėstantis jo elementų. Kodas parodo, kaip kuriate pagrindinę kolekciją ir pridedate, pašalinate ir išbandote elementus. Nes Vektorius
dabar palaiko Kolekcija
sąsają, šį kodą galite vykdyti ir vektoriuje, kurį galite išbandyti pakeisdami „HashSet“
deklaracija ir konstruktorius a Vektorius
.
importuoti java.util.collections. *; public class CollectionTest {// Statics public static void main (String [] args) {System.out.println ("Kolekcijos testas"); // Sukurti kolekciją HashSet kolekcija = new HashSet (); // Pridedamas styginis šuo1 = "Max", dog2 = "Bailey", dog3 = "Harriet"; kolekcija.add (šuo1); kolekcija.add (šuo2); kolekcija.add (šuo3); // System.out.println dydžio nustatymas ("Sukurta kolekcija" + ", size =" + collection.size () + ", isEmpty =" + collection.isEmpty ()); // Talpinimo sistema.out.println ("Kolekcijoje yra" + dog3 + ":" + collection.contains (dog3)); // Kartojimas. Iterator palaiko hasNext, next, pašalinkite System.out.println ("Kolekcijos iteracija (nerūšiuota):"); Iteratoriaus iteratorius = kolekcija.iteratorius (); while (iterator.hasNext ()) System.out.println ("" + iterator.next ()); // Kolekcijos šalinimas.remove (dog1); kolekcija.neaišku (); }}
Dabar remkimės savo pagrindinėmis kolekcijų žiniomis ir panagrinėkime kitas „Java Collections“ sąsajas ir diegimus.
Geras konkretus įgyvendinimas
Mes pasinaudojome Kolekcija
sąsaja betoninėje kolekcijoje, „HashSet“
. Dabar apžvelkime visą konkretaus rinkinio diegimo rinkinį, pateiktą „Java Collections“ sistemoje. (Žr. Skyrių „Ištekliai“, kur rasite nuorodą į „Sun“ anotuotus „Java“ rinkinių sistemos aprašus.)
Įgyvendinimai | ||||||
---|---|---|---|---|---|---|
Maišos lentelė | Keistinas masyvas | Subalansuotas medis (rūšiuojamas) | Susietas sąrašas | Palikimas | ||
Sąsajos | Nustatyti | „HashSet“ | * | Medžių rinkinys | * | * |
Sąrašas | * | „ArrayList“ | * | „LinkedList“ | Vektorius | |
Žemėlapis | HashMap | * | Medžio žemėlapis | * | „Hashtable“ |
Žvaigždute (*) pažymėti diegimai neturi prasmės arba nepateikia įtikinamų priežasčių juos įgyvendinti. Pavyzdžiui, teikiant a Sąrašas
sąsaja su „Hash“ lentele neturi prasmės, nes „Hash“ lentelėje nėra tvarkos sąvokos. Panašiai nėra Žemėlapis
susieto sąrašo sąsaja, nes sąraše nėra lentelės paieškos sąvokos.
Dabar naudokimės Sąrašas
sąsaja, valdant konkrečius diegimus, kurie įgyvendina Sąrašas
sąsaja, „ArrayList“
, ir „LinkedList“
. Žemiau pateiktas kodas yra panašus į ankstesnį pavyzdį, tačiau jis veikia daug Sąrašas
operacijos.
importuoti java.util.collections. *; public class ListTest {// Statics public static void main (String [] args) {System.out.println ("Sąrašo testas"); // Sukurti kolekciją ArrayList list = new ArrayList (); // Styginių [] žaislų pridėjimas = {"Batas", "Kamuolys", "Frizas"}; list.addAll (Arrays.toList (žaislai)); // „System.out.println“ dydžio nustatymas ("sukurtas sąrašas" + ", dydis =" + list.size () + ", isEmpty =" + list.isEmpty ()); // Iteracija naudojant indeksus. System.out.println ("Sąrašo kartojimas (nerūšiuotas):"); for (int i = 0; i <list.size (); i ++) System.out.println ("" + list.get (i)); // Atvirkštinė iteracija naudojant ListIterator System.out.println ("Sąrašo iteracija (atvirkštinė):"); ListIterator iterator = list.listIterator (list.size ()); while (iterator.hasPrevious ()) System.out.println ("" + iterator.previous ()); // Šalinamas sąrašas.remove (0); sąrašas.skaidrus (); }}
Kaip ir pirmąjį pavyzdį, taip paprasta pakeisti vieną diegimą kitu. Galite naudoti a „LinkedList“
vietoj „ArrayList“
paprasčiausiai pakeisdami liniją su „ArrayList“
konstruktorius. Panašiai galite naudoti a Vektorius
, kuri dabar palaiko Sąrašas
sąsaja.
Sprendžiant tarp šių dviejų diegimų, turėtumėte apsvarstyti, ar sąrašas yra nepastovus (dažnai auga ir mažėja) ir ar prieiga atsitiktinė, ar užsakyta. Mano paties bandymai parodė, kad „ArrayList“
paprastai lenkia „LinkedList“
ir naujas Vektorius
.
Atkreipkite dėmesį, kaip mes įtraukiame elementus į sąrašą: mes naudojame Pridėti viską
metodas ir statinis metodas Masyvai.į sąrašą
. Šis statinis metodas yra vienas iš naudingiausių naudingumo metodų rinkinių sistemoje, nes leidžia bet kurį masyvą laikyti a Sąrašas
. Dabar masyvas gali būti naudojamas bet kur a Kolekcija
yra reikalingas.
Atkreipkite dėmesį, kad aš kartojuosi per sąrašą per indeksuotą prieigą, gauti
, ir „ListIterator“
klasė. Be atvirkštinio kartojimo, „ListIterator“
klasė leidžia pridėti, pašalinti ir nustatyti bet kurį sąrašo elementą toje vietoje, kuriai skirtas „ListIterator“
. Šis metodas yra labai naudingas filtruojant ar atnaujinant sąrašą pagal elementus.
Paskutinė pagrindinė „Java Collections“ sąsaja yra Žemėlapis
. Ši sąsaja įgyvendinama dviem naujais konkrečiais diegimais - Medžio žemėlapis
ir HashMap
. Medžio žemėlapis
yra subalansuotas medžio įgyvendinimas, kuris rūšiuoja elementus pagal raktą.
Parodykime, kaip naudojamas Žemėlapis
sąsaja su paprastu pavyzdžiu, parodančiu, kaip pridėti, pateikti užklausą ir išvalyti kolekciją. Šis pavyzdys, kuriame naudojamas HashMap
klasės, nedaug skiriasi nuo to, kaip mes naudojome „Hashtable“
prieš kolekcijų sistemos debiutą. Dabar su atnaujinimu „Hashtable“
remti Žemėlapis
sąsają, galite pakeisti eilutę, kuri sukuria HashMap
ir pakeiskite jį „Hashtable“
.