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
, aliZemljevid
- 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 izvajateZbirka
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
inVektor
, ki so bili posodobljeni za izvajanjeZbirka
vmesniki so dodane nove izvedbe zbirk, vključno zHashSet
inTreeSet
,ArrayList
inLinkedList
, inHashMap
inZemljevid
. 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 vrstaNaštevanje
ki omogoča operacije elementov, kot sta vstavljanje in brisanje. TheIterator
je "hitra", kar pomeni, da dobite izjemo, če seznam, ki ga ponavljate, spremeni drug uporabnik. Tudi zbirke, ki temeljijo na seznamih, kot soVektor
vrni aListIterator
ki omogočajo dvosmerno ponavljanje in posodabljanje.Več zbirk (
TreeSet
inTreeMap
) 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 (aPrimerjalnik
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 tabela | Spremenljiva matrika | Uravnoteženo drevo (razvrščeno) | Povezani seznam | Zapuščina | ||
Vmesniki | Nastavite | HashSet | * | TreeSet | * | * |
Seznam | * | ArrayList | * | LinkedList | Vektor | |
Zemljevid | HashMap | * | 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
.