Programmēšana

Sāciet darbu ar Java kolekciju sistēmu

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 Vectorun 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, Sarakstsvai Karte - 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šat Kolekcija 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 un Vector, kas ir atjaunināti, lai ieviestu Kolekcija saskarnes, ir pievienotas jaunas kolekcijas ieviešanas iespējas, tostarp HashSet un TreeSet, ArrayList un LinkedList, un HashMap un Karte. 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 veida Uzskaitīšana kas ļauj veikt tādas darbības kā ievietošana un dzēšana. The Iterators 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 a ListIterator kas ļauj divvirzienu atkārtot un atjaunināt.

    Vairākas kolekcijas (TreeSet un TreeMap) 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 (a Salī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, Sarakstsvai 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 tabulaMaināms masīvsSabalansēts koks (kārtots)Saistītais sarakstsMantojums
Saskarnes IestatietHashSet* TreeSet* *
Saraksts* ArrayList* LinkedListVector
KarteHashMap* 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, ArrayListun 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ūtun 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.

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