CodeGym /Java-blogg /Tilfeldig /Java vektor
John Squirrels
Nivå
San Francisco

Java vektor

Publisert i gruppen
Sannsynligvis har du allerede kommet over arrays i Java, og du vet at en av de største ulempene deres er størrelseskonstans. Når du har opprettet en matrise av en viss størrelse, kan du ikke endre det senere. Det er flere Java Collection-rammeverkklasser i Java-språket som løser dette problemet. En av dem er Java Vector Class. Det vil bli diskutert i denne artikkelen.

Hva er Vector Class

Som vi skrev i forordet, eliminerer Vector -klassen fra Java Collection Framework problemet med den statiske størrelsen på arrays. Java Vector er en slags dynamisk array og kan vokse eller krympe i størrelse. Ved å bruke Vector- samlingsklassen kan vi lagre en gruppe elementer som enkle objekter og manipulere dem gjennom de ulike metodene. Vector-klassen er tilgjengelig fra java.util- pakken. Dermed kan Vector i Java brukes hvis du ikke vet størrelsen på arrayet på forhånd, eller hvis du trenger en "array" som kan endre dimensjoner i løpet av programmets levetid. Det må sies med en gang at Vectorklasse er allerede ganske gammel, og senere dukket det opp samlinger som kan erstatte den i de aller fleste tilfeller. Den populære "analogen" til Java Vector er ArrayList- klassen. Den viktigste forskjellen mellom disse klassene fra hverandre er at Vector er synkronisert, mens ArrayList ikke er det. Vi vil snakke om andre forskjeller mellom disse to klassene og mer moderne analoger av Vector- klassen litt senere i avsnittet "Hva er galt med Vector-klassen".

Java vektormetoder

Her er Java Vector Methods:
  • void add(int index, Object element) setter inn det spesifiserte elementet på den angitte posisjonen til vektoren.

  • boolean add(Object o) legger til det spesifiserte elementet til slutten av vektoren.

  • boolean addAll(Collection c) legger til alle elementene i den angitte samlingen til slutten av vektoren, i den rekkefølgen de returneres av den spesifiserte samlingsiteratoren.

  • boolean addAll(int index, Collection c) setter inn alle elementer i den angitte samlingen i vektoren på den angitte posisjonen.

  • void addElement(Object obj) legger til den spesifiserte komponenten til slutten av denne vektoren, og øker størrelsen med én.

  • int kapasitet() returnerer gjeldende kapasitet til denne vektoren.

  • void clear() fjerner alle elementer fra denne vektoren.

  • Object clone() returnerer en klone av denne vektoren.

  • boolean contains(Object elem) tester om det spesifiserte objektet er en komponent i denne vektoren.

  • boolean containsAll(Collection c) returnerer true hvis vektoren inneholder alle elementene i den angitte samlingen.

  • void copyInto(Object[] anArray) kopierer komponentene i denne vektoren til den spesifiserte matrisen.

  • ObjektelementAt(int indeks) returnerer komponenten ved den angitte indeksen.

  • Enumeration elements() returnerer en opptelling av komponentene i denne vektoren.

  • void sureCapacity(int minCapacity) øker kapasiteten til denne vektoren, om nødvendig, for å sikre at den kan inneholde minst antallet komponenter gitt av minimumskapasitetsargumentet.

  • boolean equals(Object o) sammenligner det spesifiserte objektet med denne vektoren.

  • Objekt firstElement() returnerer den første komponenten (element ved indeks 0) av denne vektoren.

  • Objekt get(int indeks) returnerer elementet på den angitte posisjonen i denne vektoren.

  • int hashCode() returnerer hashkodeverdien for denne vektoren.

  • int indexOf(Object elem) søker etter den første forekomsten av det gitte argumentet, og tester for likhet ved å bruke likhetsmetoden.

  • int indexOf(Objekt elem, int indeks) søker etter den første forekomsten av det gitte argumentet, starter ved indeks, og tester for likhet ved å bruke likhetsmetoden.

  • void insertElementAt(Object obj, int index) setter inn det spesifiserte objektet som en komponent i denne vektoren ved den spesifiserte indeksen.

  • boolean isEmpty() tester denne vektoren for manglende komponenter.

  • Objekt lastElement() returnerer den siste komponenten i vektoren.

  • int lastIndexOf(Objekt elem) returnerer indeksen for siste forekomst av det spesifiserte objektet i denne vektoren.

  • int lastIndexOf(Objekt elem, int indeks) søker bakover etter det spesifiserte objektet, starter ved den angitte indeksen, og returnerer indeksen til den.

  • Object remove(int index) fjerner elementet på den angitte posisjonen i denne vektoren.

  • boolean remove(Object o) fjerner den første forekomsten av det spesifiserte elementet i denne vektoren. Hvis vektoren ikke inneholder et element, endres den ikke.

  • boolean removeAll(Collection c) fjerner alle elementer fra vektoren som finnes i den angitte samlingen.

  • void removeAllElements() fjerner alle komponenter fra vektoren og setter størrelsen til null.

  • boolean removeElement(Object obj) fjerner den første (laveste indeksen) forekomsten av argumentet fra denne vektoren.

  • void removeElementAt(int index) fjerner et element ved indeks.

  • beskyttet void removeRange(int fromIndex, int toIndex) fjerner fra denne listen alle elementer hvis indeks er mellom fromIndex, inklusive, og toIndex, eksklusivt.

  • boolean retainAll(Collection c) beholder bare elementene i vektoren som er inneholdt i den angitte samlingen.

  • Objektsett(int indeks, Objektelement) erstatter elementet på den angitte posisjonen i denne vektoren med det spesifiserte elementet.

  • void setElementAt(Object obj, int index) setter komponenten til den spesifiserte indeksen til denne vektoren som det gitte objektet.

  • void setSize(int newSize) setter størrelsen på denne vektoren.

  • int size() returnerer antall komponenter i denne vektoren.

  • List subList(int fromIndex, int toIndex) returnerer en representasjon (visning) av delen av denne listen mellom fromIndex, inklusive, og toIndex, eksklusivt.

  • Objekt[] tilArray() returnerer en matrise som inneholder alle elementene i denne vektoren i riktig rekkefølge.

  • Objekt[] tilArray(Objekt[] a) returnerer en matrise som inneholder alle elementene i denne vektoren i riktig rekkefølge; utførelsestypen til den returnerte matrisen er typen til den angitte matrisen.

  • String toString() returnerer en strengrepresentasjon av denne vektoren som inneholder en strengrepresentasjon av hvert element.

  • void trimToSize() trimmer kapasiteten til denne vektoren til vektorens gjeldende størrelse.

Java vektor eksempel


import java.util.Vector;

public class VectorExample {

   public static void main(String[] args) {
       Vector vector = new Vector();
       System.out.println("the size of the empty vector = " +  vector.size());
       //adding some vector elements
       vector.add("Johnny");
       vector.add("Ivy");
       vector.add("Ricky");
       System.out.println(vector); 
       
       //adding more vector elements       
       vector.add("Johnny");
       vector.add("Paul");
       System.out.println(vector);
       System.out.println("the size of the vector = " +  vector.size());
       System.out.println("the first element of the vector = " + vector.firstElement());

       //here the program will print out the first appearance of "Johnny" element
       System.out.println(vector.indexOf("Johnny"));
       //program will print out the first appearance of "Johnny" element starting from the element 1
       System.out.println(vector.indexOf("Johnny", 1));
       vector.clear(); //deleting all vector elements
       System.out.println("the size of the vector after clear method = " +  vector.size());

   }
}
Resultatet av dette programmet er her nedenfor:
størrelsen på den tomme vektoren = 0 [Johnny, Ivy, Ricky] [Johnny, Ivy, Ricky, Johnny, Paul] størrelsen på vektoren = 5 det første elementet i vektoren = Johnny 0 3 størrelsen på vektoren etter clear metode = 0

Hva er galt med Vector Class?

I følge dokumentasjonen til Java Vector -klassen, hvis du ikke trenger en trådsikker implementering i programmet, anbefales det å bruke ArrayList i stedet for Vector (Collection Framework mer effektiv deltaker). La oss endre eksemplet ovenfor litt, ved å bruke ArrayList- klassen i stedet for Vector .

import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {

       public static void main(String[] args) {
           List vector = new ArrayList();
           //Vector vector = new Vector();
           System.out.println("the size of the empty vector = " +  vector.size());
           vector.add("Johnny");
           vector.add("Ivy");
           vector.add("Ricky");
           System.out.println(vector);
           vector.add("Johnny");
           vector.add("Paul");
           System.out.println(vector);
           System.out.println("the size of the vector = " +  vector.size());
           //System.out.println("the first element of the vector = " + vector.firstElement());

           //here the program will print out the first appearance of "Johnny" element
           System.out.println(vector.indexOf("Johnny"));
           //program will print out the first appearance of "Johnny" element starting from the element 1
           //System.out.println(vector.indexOf("Johnny", 1));
           vector.clear();
           System.out.println("the size of the vector after clear method = " +  vector.size());

       }
   }
Vi kommenterte linjen med vector.indexOf("Johnny", 1) , fordi det ikke er noen slik metode i denne varianten i ArrayList- klassen. Av samme grunn ble vector.firstElement()- linjen kommentert ut. I alle andre henseender gir programmet samme resultat som det første. Selvfølgelig, i et slikt eksempel, er det ikke klart hvorfor ArrayList er bedre enn Vector . Dette krever mer kunnskap om for eksempel tråder. Vi lister opp årsakene her. For det første, selv om Vector -klassen er synkronisert, kan den ikke kalles helt trådsikker, selv om dette virker merkelig. Faktum er at Vector synkroniserer hver operasjon, ikke hele Vectorselve forekomsten. Dette kan være et problem i programmer der du trenger å synkronisere hele settet med operasjoner i stedet for individuelle operasjoner. Si at hvis en tråd itererer over en vektor og en annen tråd strukturelt modifiserer en forekomst av vektoren, vil iteratoren kaste en ConcurrentModificationException . Det viser seg at to tråder kan fungere med en Vector- instans samtidig hvis de utfører forskjellige operasjoner. For det andre, Vectorklasse har ikke den beste ytelsen fordi objektene har en matrise som kan endres størrelse og synkronisering. Denne kombinasjonen betyr ekstra overhead for blokkeringsoperasjoner, enten synkronisering er nødvendig eller ikke. Jada, dette påvirker ytelsen. I tillegg har synkronisering av vektoren på hver operasjon også en negativ effekt på ytelsen, siden vi får en lås igjen og igjen for hver operasjon. Hvis hele forekomsten av klassen ble synkronisert, ville låsen også blitt anskaffet én gang, noe som er mye mer effektivt. For det tredje støtter Vector noen eldre metoder. For eksempel elementer(). Denne metoden returnerer en opptelling av komponentene i vektoren. Programmerere bruker oftest Iterator eller ListIterator til Enumeration, og av flere grunner. Spesielt har Enumeration ikke en remove() -metode definert, noe som betyr at listen ikke kan endres strukturelt under iterasjon. I motsetning til ListIterator, tilbyr ikke Enumeration toveis tilgang. Som du kan se, har Vector ganske mange problemer. Hva om du fortsatt trenger en trådsikker implementering av List-grensesnittet? I dette tilfellet hjelper ikke ArrayList , men du kan for eksempel bruke CopyOnWriteArrayList -klassen i stedet for Vector ; den er plassert som en trådsikker variant av ArrayList. Du kan også synkronisere ArrayList ved å bruke Collections synchronizedList()- metoden.

Vector har virkelig noen problemer ... hvorfor er det fortsatt i Java og hvorfor bør det læres?

Spørsmålet oppstår: hvorfor studerer vi Vector- klassen i det hele tatt? Og hvorfor har den ikke blitt fjernet fra Java ennå? Faktum er at Java bekjenner prinsippet om bakoverkompatibilitet. Dette betyr at all gammel kode skrevet for mange år siden vil bli forstått av moderne versjoner av Java. I tillegg er det ganske mange applikasjoner på bedriftsnivå i Java-miljøet som har blitt støttet i flere tiår. Det er ganske mulig at du må forholde deg til en slik "dinosaur" i arbeidet ditt, så du må være forberedt på overraskelser, for eksempel kode med ineffektive eldreklasser.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION