JDK 1.2 ievieš jaunu objektu kolekciju sistēmu, ko sauc par Java kolekciju ietvaru. "Ak nē," jūs vaidat, "ne citu API, ne citu ietvaru, lai mācītos!" Bet pagaidiet, pirms jūs novērsieties, dzirdiet mani: kolekciju sistēma ir jūsu pūļu vērta un daudzos veidos sniegs labumu jūsu programmēšanai. Tūlīt nāk prātā trīs lielas priekšrocības:
- Tas ievērojami palielina jūsu kolekciju lasāmību, nodrošinot standarta saskarņu komplektu, ko daudzi programmētāji izmanto daudzās lietojumprogrammās.
- Tas padara jūsu kodu elastīgāku, ļaujot jums nodot un atgriezt saskarnes, nevis konkrētas klases, vispārināt kodu, nevis bloķēt to.
- Tas piedāvā daudzas specifiskas saskarņu ieviešanas iespējas, ļaujot izvēlēties kolekciju, kas ir vispiemērotākā un piedāvā visaugstāko veiktspēju jūsu vajadzībām.
Un tas ir tikai iesācējiem.
Mūsu ceļvedis pa sistēmu sāksies ar pārskatu par priekšrocībām, ko tas sniedz objektu komplektu uzglabāšanai. Kā jūs drīz atklāsiet, jo jūsu vecie darba zirga draugi Hashtable
un Vector
atbalstiet jauno API, jūsu programmas būs vienotas un kodolīgas - par kaut ko jūs un izstrādātāji, kas piekļūst jūsu kodam, noteikti iepriecināsit.
Pēc mūsu iepriekšējās diskusijas mēs iedziļināsimies detaļās.
Java kolekciju priekšrocība: pārskats
Pirms kolekcijas debitēja visvairāk, Java objektu grupēšanas standarta metodes tika izmantotas, izmantojot masīvu Vector
un Hashtable
. Visām trim šīm kolekcijām ir dažādas metodes un sintakse, lai piekļūtu dalībniekiem: masīvos tiek izmantoti kvadrātiekavas ([]) simboli, Vector
izmanto elementAt
metodi un Hashtable
izmanto gūt
un likt
metodes. Šīs atšķirības jau sen ir novedušas programmētājus uz nesaskaņotību, ieviešot savas kolekcijas - daži līdzinās Vector
piekļuves metodes un daži līdzinās Uzskaitīšana
interfeiss.
Lai vēl vairāk sarežģītu situāciju, lielākā daļa Vector
metodes ir atzīmētas kā galīgas; tas ir, jūs nevarat pagarināt Vector
klasē, lai ieviestu līdzīga veida kolekciju. Mēs varētu izveidot kolekcijas klasi, kas izskatījās kā a Vector
un rīkojās kā a Vector
, taču to nevarēja nodot metodei, kas prasa a Vector
kā parametru.
Visbeidzot, neviena no kolekcijām (masīvs, Vector
vai Hashtable
) ievieš standarta dalībnieka piekļuves saskarni. Kad programmētāji izstrādāja algoritmus (piemēram, veidus), lai manipulētu ar kolekcijām, sākās karsts diskurss par to, kādu objektu nodot algoritmam. Ja jums iet masīvs vai a Vector
? Vai jums vajadzētu ieviest abas saskarnes? Runājiet par dublēšanos un neskaidrībām.
Par laimi, Java kolekciju ietvars novērš šīs problēmas un piedāvā vairākas priekšrocības salīdzinājumā ar bez ietvara izmantošanu vai Vector
un Hashtable
:
Lietojams kolekcijas saskarņu komplekts
Ieviešot vienu no pamata saskarnēm -
Kolekcija
,Iestatiet
,Saraksts
vaiKarte
- jūs pārliecināties, ka jūsu klase atbilst kopīgai API, kļūst regulārāka un viegli saprotama. Tātad, neatkarīgi no tā, vai jūs ieviešat SQL datu bāzi, krāsu paraugu saskaņotāju vai attālās tērzēšanas lietojumprogrammu, ja to ieviešatKolekcija
interfeisu, jūsu objektu kolekcijas darbības ir labi zināmas jūsu lietotājiem. Standarta saskarnes arī vienkāršo kolekciju nodošanu un atgriešanu klases metodēs un no tām, kā arī ļauj šīm metodēm strādāt pie daudzveidīgākām kolekcijām.Kolekcijas ieviešanas pamatkomplekts
Papildus uzticamajiem
Hashtable
unVector
, kas ir atjaunināti, lai ieviestuKolekcija
saskarnes, ir pievienotas jaunas kolekcijas ieviešanas iespējas, tostarpHashSet
unTreeSet
,ArrayList
unLinkedList
, unHashMap
unKarte
. Izmantojot esošu, izplatītu ieviešanu, kods ir īsāks un ātrāk lejupielādējams. Izmantojot esošo Java koda kodolu, tiek nodrošināts, ka visi pamata koda uzlabojumi arī uzlabos jūsu koda veiktspēju.Citi noderīgi uzlabojumi
Katra kolekcija tagad atgriež
Iterators
, uzlabota veidaUzskaitīšana
kas ļauj veikt tādas darbības kā ievietošana un dzēšana. TheIterators
ir "ātri neizdoties", kas nozīmē, ka saņemat izņēmumu, ja atkārtoto sarakstu mainījis cits lietotājs. Arī uz sarakstiem balstītas kolekcijas, piemēram,Vector
atgriezties aListIterator
kas ļauj divvirzienu atkārtot un atjaunināt.Vairākas kolekcijas (
TreeSet
unTreeMap
) netieši atbalsta pasūtīšanu. Izmantojiet šīs klases, lai uzturētu sakārtotu sarakstu bez piepūles. Lai uzlabotu lielo sarakstu veiktspēju, varat atrast vismazākos un lielākos elementus vai veikt bināro meklēšanu. Varat kārtot citas kolekcijas, nodrošinot kolekciju salīdzināšanas metodi (aSalīdzinātājs
objektu) vai objektu salīdzināšanas metodi (Salīdzināms
interfeiss).Visbeidzot, statiskā klase
Kolekcijas
nodrošina nemodificējamas (tikai lasāmas) un sinhronizētas esošo kolekciju versijas. Nemodificējamās klases ir noderīgas, lai novērstu nevēlamas izmaiņas kolekcijā. Sinhronizēta kolekcijas versija ir nepieciešama vairāku pavedienu programmām.
Java kolekciju ietvars ir Java pamatdaļa un ir ietverts java.util.collections
pakete JDK 1.2. Sistēma ir pieejama arī kā JDK 1.1 pakete (sk. Resursus).
Piezīme. Ir nosaukta kolekciju JDK 1.1 versija com.sun.java.util.collections
. Paturiet prātā, ka ar 1.1 versiju izstrādātais kods ir jāatjaunina un jāpārkompilē 1.2 versijai, un visus 1.1. Versijā seriālizētos objektus nevar deserializēt 1.2.
Tagad pievērsīsimies šīm priekšrocībām rūpīgāk, izmantojot Java Collections Framework ar kādu mūsu pašu kodu.
Laba API
Pirmā Java Collections Framework priekšrocība ir konsekventa un regulāra API. API ir kodēta pamata saskarņu komplektā, Kolekcija
, Iestatiet
, Saraksts
vai Karte
. The Kolekcija
interfeiss satur tādas pamata vākšanas darbības kā pievienošana, noņemšana un dalības pārbaudes (ierobežošana). Jebkura kolekcijas ieviešana neatkarīgi no tā, vai to nodrošina Java kolekciju ietvars vai kāds no jūsu pašu veidotajiem, atbalstīs vienu no šīm saskarnēm. Tā kā kolekciju sistēma ir regulāra un konsekventa, lielu daļu ietvaru uzzināsiet, vienkārši apgūstot šīs saskarnes.
Abi Iestatiet
un Saraksts
īstenot Kolekcija
interfeiss. The Iestatiet
saskarne ir identiska Kolekcija
interfeiss, izņemot papildu metodi, uz masīvu
, kas pārveido a Iestatiet
uz an Objekts
masīvs. The Saraksts
interfeiss arī īsteno Kolekcija
interfeisu, bet nodrošina daudz piekļuvēju, kas sarakstā izmanto vesela skaitļa indeksu. Piemēram, gūt
, noņemt
, un komplekts
visi ņem veselu skaitli, kas ietekmē indeksēto elementu sarakstā. The Karte
interfeiss nav iegūts no kolekcijas, bet nodrošina saskarni, kas ir līdzīga metodēm, kas norādītas java.util.Hashtable
. Atslēgas tiek izmantotas vērtību ievietošanai un iegūšanai. Katra no šīm saskarnēm ir aprakstīta šādos kodu piemēros.
Šis kodu segments parāda, kā veikt daudzus Kolekcija
operācijas HashSet
, pamata kolekcija, kas īsteno Iestatiet
interfeiss. A HashSet
ir vienkārši kopa, kas nepieļauj elementu dublikātus un nenosaka vai nenovieto tā elementus. Kods parāda, kā jūs izveidojat pamata kolekciju un pievienojat, noņemat un pārbaudāt elementus. Tā kā Vector
tagad atbalsta Kolekcija
interfeisu, jūs varat arī izpildīt šo kodu vektorā, kuru varat pārbaudīt, mainot HashSet
deklarācija un konstruktors a Vector
.
importēt java.util.collections. *; public class CollectionTest {// Statics public static void main (String [] args) {System.out.println ("Kolekcijas tests"); // Izveidot kolekciju HashSet kolekcija = new HashSet (); // String dog1 = "Max", dog2 = "Bailey", dog3 = "Harriet" pievienošana; kolekcija.add (suns1); kolekcija.add (suns2); kolekcija.add (suns3); // Sizing System.out.println ("Kolekcija izveidota" + ", size =" + collection.size () + ", isEmpty =" + collection.isEmpty ()); // Ietveršanas sistēma.out.println ("Kolekcija satur" + dog3 + ":" + kolekcija. Satur (suns3)); // Iterācija. Iterator atbalsta hasNext, next, noņemiet System.out.println ("Kolekcijas atkārtojums (nešķirots):"); Iteratora iterators = kolekcija.iterators (); while (iterator.hasNext ()) System.out.println ("" + iterator.next ()); // Kolekcijas noņemšana. Noņemt (suns1); kolekcija.skaidrs (); }}
Tagad izmantosim savas pamatzināšanas par kolekcijām un aplūkosim citas saskarnes un implementācijas Java kolekciju sistēmā.
Labas konkrētas ieviešanas iespējas
Mēs esam izmantojuši Kolekcija
saskarne ar konkrētu kolekciju, HashSet
. Apskatīsim visu Java kolekciju ietvarā esošo konkrēto kolekciju ieviešanas komplektu. (Skatiet sadaļu Resursi, lai iegūtu saiti uz Sun anotēto Java kolekciju ietvara izklāstu.)
Īstenošana | ||||||
---|---|---|---|---|---|---|
Hash tabula | Maināms masīvs | Sabalansēts koks (kārtots) | Saistītais saraksts | Mantojums | ||
Saskarnes | Iestatiet | HashSet | * | TreeSet | * | * |
Saraksts | * | ArrayList | * | LinkedList | Vector | |
Karte | HashMap | * | TreeMap | * | Hashtable |
Īstenojumiem, kas atzīmēti ar zvaigznīti (*), nav jēgas vai tie nav pārliecinoši iemesli, lai tos ieviestu. Piemēram, nodrošinot Saraksts
saskarnei ar hash tabulu nav jēgas, jo hash tabulā nav kārtības jēdziena. Tāpat nav Karte
sasaistītā saraksta saskarne, jo sarakstā nav tabulas meklēšanas jēdziena.
Tagad izmantosim Saraksts
saskarni, darbojoties ar konkrētām realizācijām, kas ievieš Saraksts
interfeiss, ArrayList
un LinkedList
. Tālāk redzamais kods ir līdzīgs iepriekšējam piemēram, taču tas veic daudz Saraksts
operācijas.
importēt java.util.collections. *; public class ListTest {// Statics public static void main (String [] args) {System.out.println ("Saraksta tests"); // Izveidot kolekciju ArrayList list = new ArrayList (); // Stīgu [] rotaļlietu pievienošana = {"Apavi", "Bumba", "Frisbijs"}; list.addAll (Arrays.toList (rotaļlietas)); // Sizing System.out.println ("Saraksts izveidots" + ", size =" + list.size () + ", isEmpty =" + list.isEmpty ()); // Iterācija, izmantojot indeksus. System.out.println ("Saraksta atkārtojums (nešķirots):"); priekš (int i = 0; i <list.size (); i ++) System.out.println ("" + list.get (i)); // Reversā atkārtojums, izmantojot ListIterator System.out.println ("Saraksta atkārtojums (reverss):"); ListIterator iterator = list.listIterator (list.size ()); while (iterator.hasPrevious ()) System.out.println ("" + iterator.previous ()); // saraksta noņemšana. Noņemt (0); saraksts.skaidrs (); }}
Tāpat kā pirmajā piemērā, ir viegli nomainīt vienu ieviešanu pret citu. Jūs varat izmantot a LinkedList
vietā ArrayList
vienkārši mainot līniju ar ArrayList
konstruktors. Līdzīgi varat izmantot a Vector
, kas tagad atbalsta Saraksts
interfeiss.
Izlemjot starp šīm divām ieviešanām, jums jāapsver, vai saraksts ir nepastāvīgs (bieži aug un samazinās) un vai piekļuve ir nejauša vai pasūtīta. Mani paši testi ir parādījuši, ka ArrayList
parasti pārspēj LinkedList
un jaunais Vector
.
Ievērojiet, kā mēs sarakstam pievienojam elementus: mēs izmantojam addAll
metode un statiskā metode Masīvi.toList
. Šī statiskā metode ir viena no visnoderīgākajām utilītu metodēm kolekciju sistēmā, jo tā ļauj jebkuru masīvu uzskatīt par a Saraksts
. Tagad masīvu var izmantot jebkur a Kolekcija
ir vajadzīgs.
Ievērojiet, ka es atkārtoju sarakstu, izmantojot indeksētu piekļuvi, gūt
un ListIterator
klasē. Papildus reversai iterācijai ListIterator
klase ļauj jums pievienot, noņemt un iestatīt jebkuru saraksta elementu sadaļā, uz kuru attiecas ListIterator
. Šī pieeja ir diezgan noderīga, lai filtrētu vai atjauninātu sarakstu pa elementiem.
Java kolekciju ietvara pēdējais pamata interfeiss ir Karte
. Šī saskarne ir ieviesta ar diviem jauniem konkrētiem ieviešanas veidiem - TreeMap
un HashMap
. The TreeMap
ir līdzsvarota koka ieviešana, kas elementus kārto pēc atslēgas.
Ilustrēsim Karte
saskarne ar vienkāršu piemēru, kas parāda, kā pievienot, vaicāt un notīrīt kolekciju. Šis piemērs, kurā izmantots HashMap
klase, daudz neatšķiras no tā, kā mēs izmantojām Hashtable
pirms kolekciju ietvara debijas. Tagad ar atjauninājumu Hashtable
atbalstīt Karte
interfeisu, varat nomainīt līniju, kas momentāno HashMap
un aizstāt to ar Hashtable
.