Programiranje

Začnite z ogrodjem zbirk Java

JDK 1.2 uvaja nov okvir za zbirke predmetov, imenovan Java Collections Framework. "Oh ne," zastokate, "ne drugega API-ja, ne drugega okvira za učenje!" Toda počakajte, preden se obrnete stran, me poslušajte: okvir Zbirke je vreden vašega truda in bo v mnogih pogledih koristil vašemu programiranju. Takoj se spomnimo treh velikih prednosti:

  • Dramatično poveča berljivost vaših zbirk z zagotavljanjem standardnega nabora vmesnikov, ki jih mnogi programerji uporabljajo v številnih aplikacijah.
  • Vaša koda je bolj prilagodljiva, saj vam omogoča, da posredujete in vračate vmesnike namesto konkretnih razredov, ki posplošujejo kodo in ne zaklepajo.
  • Ponuja številne posebne izvedbe vmesnikov, kar vam omogoča, da izberete zbirko, ki se najbolj prilega in ponuja najvišjo zmogljivost za vaše potrebe.

In to samo za začetek.

Naš ogled okvira se bo začel s pregledom prednosti, ki jih ponuja shranjevanje sklopov predmetov. Kot boste kmalu odkrili, saj vaši stari prijatelji na delovnem konju Hashtable in Vektor podpirate nov API, bodo vaši programi enotni in jedrnati - nekaj, česar boste vi in ​​razvijalci, ki dostopajo do vaše kode, zagotovo navdušeni.

Po predhodni razpravi se bomo poglobili v podrobnosti.

Prednost zbirk Java: pregled

Preden je bil Collections prvič dobrodošel, so bile standardne metode za razvrščanje predmetov Java prek polja, Vektor, in Hashtable. Vse tri zbirke imajo različne metode in sintakso za dostop do članov: polja uporabljajo simbole v oglatih oklepajih ([]), Vektor uporablja elementAt metoda in Hashtable uporablja dobili in dal metode. Te razlike že dolgo vodijo programerje po poti do nedoslednosti pri izvajanju lastnih zbirk - nekateri posnemajo Vektor metode dostopa in nekateri posnemajo Naštevanje vmesnik.

Za nadaljnje zapletanje zadev večina Vektor metode so označene kot dokončne; to pomeni, da ne morete razširiti Vektor razred za izvedbo podobne vrste zbirke. Lahko bi ustvarili zbirni razred, ki bi izgledal kot Vektor in se obnašal kot a Vektor, vendar je ni bilo mogoče prenesti na metodo, ki ima Vektor kot parameter.

Končno nobena od zbirk (matrika, Vektor ali Hashtable) izvaja standardni vmesnik za dostop do članov. Ko so programerji razvili algoritme (na primer sorte) za manipulacijo z zbirkami, je izbruhnil vroč diskurz o tem, kateri predmet naj posreduje algoritmu. Če prenesete matriko ali a Vektor? Bi morali vgraditi oba vmesnika? Govorimo o podvajanju in zmedi.

Na srečo Java Collections Framework odpravlja te težave in ponuja številne prednosti pred uporabo nobenega ogrodja ali uporabo Vektor in Hashtable:

  • Uporabni nabor zbirnih vmesnikov

    Z izvajanjem enega od osnovnih vmesnikov - Zbirka, Nastavite, Seznam, ali Zemljevid - zagotovite, da je vaš razred v skladu s skupnim API-jem in postane bolj navaden in lažje razumljiv. Torej, ali izvajate bazo podatkov SQL, ujemanje barvnih vzorcev ali oddaljeno aplikacijo za klepet, če izvajate Zbirka Vmesniku so operacije z zbirko predmetov dobro znane vašim uporabnikom. Standardni vmesniki poenostavljajo tudi posredovanje in vračanje zbirk v metode razredov in iz njih ter omogočajo, da metode delujejo na več različnih zbirkah.

  • Osnovni nabor izvedb zbirk

    Poleg zaupljivega Hashtable in Vektor, ki so bili posodobljeni za izvajanje Zbirka vmesniki so dodane nove izvedbe zbirk, vključno z HashSet in TreeSet, ArrayList in LinkedList, in HashMap in Zemljevid. Z uporabo obstoječe skupne izvedbe je koda krajša in hitrejša za prenos. Tudi uporaba obstoječega jedra kode Core Java zagotavlja, da bodo vse izboljšave osnovne kode izboljšale tudi učinkovitost vaše kode.

  • Druge uporabne izboljšave

    Vsaka zbirka zdaj vrne Iterator, izboljšana vrsta Naštevanje ki omogoča operacije elementov, kot sta vstavljanje in brisanje. The Iterator je "hitra", kar pomeni, da dobite izjemo, če seznam, ki ga ponavljate, spremeni drug uporabnik. Tudi zbirke, ki temeljijo na seznamih, kot so Vektor vrni a ListIterator ki omogočajo dvosmerno ponavljanje in posodabljanje.

    Več zbirk (TreeSet in TreeMap) implicitno podpira naročanje. Uporabite te razrede za vzdrževanje razvrščenega seznama brez napora. Poiščete lahko najmanjše in največje elemente ali izvedete binarno iskanje, da izboljšate delovanje velikih seznamov. Druge zbirke lahko razvrstite tako, da zagotovite metodo primerjanja zbirk (a Primerjalnik object) ali metoda primerjave objektov ( Primerljivo vmesnik).

    Na koncu še statični razred Zbirke ponuja nespremenljive (samo za branje) in sinhronizirane različice obstoječih zbirk. Nespremenljivi razredi so v pomoč pri preprečevanju neželenih sprememb zbirke. Sinhronizirana različica zbirke je za večnitne programe nujna.

Okvir Java Collections je del Core Java in je v java.util.collections paket JDK 1.2. Okvir je na voljo tudi kot paket za JDK 1.1 (glej Viri).

Opomba: Poimenovana je različica zbirk JDK 1.1 com.sun.java.util.collections. Upoštevajte, da je treba kodo, razvito z različico 1.1, posodobiti in znova sestaviti za različico 1.2 in nobenih predmetov, serializiranih v 1.1, ni mogoče deserializirati v 1.2.

Poglejmo si zdaj natančneje te prednosti z izvajanjem Java Collections Framework z neko svojo kodo.

Dober API

Prva prednost ogrodja zbirk Java je dosleden in običajen API. API je kodificiran v osnovnem nizu vmesnikov, Zbirka, Nastavite, Seznam, ali Zemljevid. The Zbirka Vmesnik vsebuje osnovne postopke zbiranja, kot so dodajanje, odstranjevanje in testi članstva (zadrževanje). Vsaka izvedba zbirke, ne glede na to, ali jo zagotavlja Okvir zbirk Java ali ena od vaših kreacij, bo podpirala enega od teh vmesnikov. Ker je okvir Zbirke reden in skladen, se boste velikega dela ogrodja naučili preprosto z učenjem teh vmesnikov.

Oboje Nastavite in Seznam izvajati Zbirka vmesnik. The Nastavite vmesnik je enak Zbirka vmesnik, razen dodatne metode, toArray, ki pretvori a Nastavite do an Predmet matriko. The Seznam vmesnik tudi izvaja Zbirka vmesnik, vendar ponuja veliko dostopnikov, ki na seznam uporabljajo celoštevilski indeks. Na primer, dobili, Odstrani, in nastavite vsi vzamejo celo število, ki vpliva na indeksirani element na seznamu. The Zemljevid vmesnik ne izhaja iz zbirke, ampak ponuja vmesnik, podoben metodam v java.util.Hashtable. Tipke se uporabljajo za postavljanje in pridobivanje vrednosti. Vsak od teh vmesnikov je opisan v naslednjih primerih kode.

Naslednji segment kode prikazuje, kako izvesti več Zbirka operacij na HashSet, osnovna zbirka, ki izvaja Nastavite vmesnik. A HashSet je preprosto niz, ki ne dovoljuje podvojenih elementov in ne razvršča ali umešča svojih elementov. Koda prikazuje, kako ustvarite osnovno zbirko ter dodate, odstranite in preizkusite elemente. Ker Vektor zdaj podpira Zbirka vmesnika, lahko to kodo izvedete tudi na vektorju, ki ga lahko preizkusite tako, da spremenite HashSet deklaracija in konstruktor na a Vektor.

uvoz java.util.collections. *; javni razred CollectionTest {// Statika javna statična void main (String [] args) {System.out.println ("Preizkus zbirke"); // Ustvari zbirko HashSet collection = new HashSet (); // Dodajanje niza dog1 = "Max", dog2 = "Bailey", dog3 = "Harriet"; collection.add (pes1); collection.add (dog2); collection.add (dog3); // Velikost System.out.println ("Zbirka ustvarjena" + ", size =" + collection.size () + ", isEmpty =" + collection.isEmpty ()); // Containment System.out.println ("Zbirka vsebuje" + dog3 + ":" + collection.contains (dog3)); // Ponavljanje. Iterator podpira hasNext, nato odstranite System.out.println ("Ponavljanje zbirke (nesortirano):"); Iterator iteratorja = collection.iterator (); while (iterator.hasNext ()) System.out.println ("" + iterator.next ()); // Odstranjevanje collection.remove (dog1); collection.clear (); }} 

Zdaj nadgradimo svoje osnovno znanje o zbirkah in si oglejmo druge vmesnike in izvedbe v okviru Java Collections Framework.

Dobre konkretne izvedbe

Izkoristili smo Zbirka vmesnik na konkretni zbirki, HashSet. Zdaj pa si oglejmo celoten nabor izvedb konkretnih zbirk, ki so na voljo v okviru Java Collections. (Glejte razdelek Viri, kjer najdete povezavo do Sončevega opomba okvira Java Collections.)

Izvedbe
Hash tabelaSpremenljiva matrikaUravnoteženo drevo (razvrščeno)Povezani seznamZapuščina
Vmesniki NastaviteHashSet* TreeSet* *
Seznam* ArrayList* LinkedListVektor
ZemljevidHashMap* TreeMap* Hashtable

Izvedbe, označene z zvezdico (*), nimajo smisla ali ne predstavljajo prepričljivega razloga za izvedbo. Na primer, zagotavljanje a Seznam vmesnik do tabele hash nima smisla, ker v tabeli hash ni pojma vrstnega reda. Podobno ni Zemljevid vmesnik za povezani seznam, ker seznam nima pojma iskanja v tabeli.

Zdaj pa vadimo Seznam vmesnik z delovanjem na konkretnih izvedbah, ki izvajajo Seznam vmesnik, ArrayList, in LinkedList. Spodnja koda je podobna prejšnjemu primeru, vendar izvaja veliko Seznam operacij.

uvoz java.util.collections. *; javni razred ListTest {// Statiki public static void main (String [] args) {System.out.println ("Test Test"); // Ustvari zbirko ArrayList list = new ArrayList (); // Dodajanje niza [] igrače = {"Čevelj", "Žoga", "Frizbi"}; list.addAll (Arrays.toList (igrače)); // Velikost System.out.println ("Seznam ustvarjen" + ", size =" + list.size () + ", isEmpty =" + list.isEmpty ()); // Ponavljanje z uporabo indeksov. System.out.println ("Ponovitev seznama (nesortirano):"); for (int i = 0; i <list.size (); i ++) System.out.println ("" + list.get (i)); // Povratna ponovitev z uporabo ListIterator System.out.println ("Ponavljanje seznama (obratno):"); ListIterator iterator = list.listIterator (list.size ()); while (iterator.hasPrevious ()) System.out.println ("" + iterator.previous ()); // Odstranjevanje seznama.remove (0); list.clear (); }} 

Kot pri prvem primeru je eno izvedbo enostavno zamenjati za drugo. Uporabite lahko LinkedList namesto ArrayList preprosto s spreminjanjem črte z ArrayList konstruktor. Podobno lahko uporabite tudi Vektor, ki zdaj podpira Seznam vmesnik.

Ko se odločite med tema dvema izvedbama, morate razmisliti, ali je seznam spremenljiv (pogosto raste in se krči) in ali je dostop naključen ali razvrščen. Moji lastni testi so pokazali, da ArrayList na splošno presega LinkedList in novo Vektor.

Upoštevajte, kako na seznam dodajamo elemente: uporabljamo addAll metoda in statična metoda Arrays.toList. Ta statična metoda je ena izmed najbolj uporabnih uporabnih metod v okviru zbirk, ker omogoča, da se poljubno polje obravnava kot Seznam. Zdaj lahko matriko uporabljate kjer koli Zbirka je potrebno.

Upoštevajte, da seznam pregledujem prek indeksiranega dostopnika, dobili, in ListIterator razred. Poleg povratne ponovitve je ListIterator razred vam omogoča dodajanje, odstranjevanje in nastavitev katerega koli elementa na seznamu na točki, ki jo naslovi ListIterator. Ta pristop je zelo uporaben za filtriranje ali posodabljanje seznama po posameznih elementih.

Zadnji osnovni vmesnik v okviru Java Collections Framework je Zemljevid. Ta vmesnik je izveden z dvema konkretnima izvedbama, TreeMap in HashMap. The TreeMap je uravnotežena izvedba drevesa, ki razvršča elemente po ključu.

Ponazorimo uporabo Zemljevid vmesnik s preprostim primerom, ki prikazuje, kako dodati, poizvedovati in počistiti zbirko. Ta primer, ki uporablja HashMap razred, se ne razlikuje veliko od tega, kako smo uporabljali Hashtable pred nastopom okvira Zbirke. Zdaj, s posodobitvijo Hashtable za podporo Zemljevid vmesnika, lahko zamenjate vrstico, ki ustvari HashMap in ga nadomestite s primerkom Hashtable.

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