Programavimas

Pradėkite naudotis „Java Collections Framework“

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šasarba Ž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 įdiegiate Kolekcija 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“ ir Vektorius, kurie buvo atnaujinti siekiant įgyvendinti Kolekcija sąsajų, buvo pridėta naujų kolekcijos diegimų, įskaitant „HashSet“ ir Medžių rinkinys, „ArrayList“ ir „LinkedList“ir HashMap 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, patobulintas Suraš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 kaip Vektorius grąžinti a „ListIterator“ kurie leidžia abipusį iteraciją ir atnaujinimą.

    Kelios kolekcijos (Medžių rinkinys ir Medž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ą (a Lyginamasis 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šasarba Ž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šalintiir 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 masyvasSubalansuotas medis (rūšiuojamas)Susietas sąrašasPalikimas
Sąsajos Nustatyti„HashSet“* Medžių rinkinys* *
Sąrašas* „ArrayList“* „LinkedList“Vektorius
ŽemėlapisHashMap* 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“.

$config[zx-auto] not found$config[zx-overlay] not found