Hurtigguide til Java Stack

1. Oversikt

I denne raske artikkelen vil vi introdusere java.util.Stack klasse og begynn å se på hvordan vi kan bruke den.

Stable er en generisk datastruktur som representerer en LIFO (siste inn, først ut) samling av objekter som muliggjør skyve / poppe elementer i konstant tid.

For de nye implementeringene, vi bør foretrekke en Deque grensesnitt og dets implementeringer. Deque definerer et mer komplett og konsistent sett med LIFO-operasjoner. Imidlertid kan det hende vi fortsatt trenger å håndtere Stable klasse, spesielt i eldre kode, er det viktig å vite det bedre.

2. Lag en stabel

La oss starte med å lage en tom forekomst av Stable, ved å bruke standard, ingen argumentkonstruktør:

@Test offentlig ugyldig nårStackIsCreated_thenItHasSizeZero () {Stack intStack = new Stack (); assertEquals (0, intStack.size ()); }

Dette vil lage en Stable med standard kapasitet på 10. Hvis antallet tilførte elementer overstiger totalen Stable størrelse, vil den dobles automatisk. Imidlertid vil størrelsen aldri krympe etter at elementene er fjernet.

3. Synkronisering for Stack

Stable er en direkte underklasse av Vector; dette betyr at på samme måte som sin superklasse, er det en synkronisert gjennomføring.

Imidlertid er synkronisering ikke alltid nødvendig, i slike tilfeller anbefales det å bruke ArrayDeque.

4. Legg i en stabel

La oss starte med å legge til et element på toppen av Stable, med trykk() metode - som også returnerer elementet som ble lagt til:

@Test offentlig ugyldig nårElementIsPushed_thenStackSizeIsIncreased () {Stack intStack = new Stack (); intStack.push (1); assertEquals (1, intStack.size ()); }

Ved hjelp av trykk() metoden har samme effekt som å bruke addElement (). Than eneste forskjellen er at addElement () returnerer resultatet av operasjonen, i stedet for elementet som ble lagt til.

Vi kan også legge til flere elementer samtidig:

@Test offentlig ugyldig nårMultipleElementsArePushed_thenStackSizeIsIncreased () {Stack intStack = new Stack (); List intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); boolsk resultat = intStack.addAll (intList); assertTrue (resultat); assertEquals (7, intList.size ()); }

5. Hent fra en bunke

Deretter, la oss ta en titt på hvordan du får og fjerner det siste elementet i en Stable:

@Test offentlig ugyldig nårElementIsPoppedFromStack_thenElementIsRemovedAndSizeChanges () {Stack intStack = new Stack (); intStack.push (5); Heltallelement = intStack.pop (); assertEquals (Integer.valueOf (5), element); assertTrue (intStack.isEmpty ()); }

Vi kan også få det siste elementet i Sstift uten å fjerne den:

@Test offentlig ugyldig nårElementIsPeeked_thenElementIsNotRemovedAndSizeDoesNotChange () {Stack intStack = new Stack (); intStack.push (5); Heltallelement = intStack.peek (); assertEquals (Integer.valueOf (5), element); assertEquals (1, intStack.search (5)); assertEquals (1, intStack.size ()); }

6. Søk etter et element i en bunke

6.1. Søk

Stable lar oss søke etter et elementog få avstanden fra toppen:

@Test offentlig ugyldig nårElementIsOnStack_thenSearchReturnsItsDistanceFromTheTop () {Stack intStack = new Stack (); intStack.push (5); intStack.push (8); assertEquals (2, intStack.search (5)); }

Resultatet er en indeks over et gitt objekt. Hvis mer enn ett element er tilstede, indeksen til den enenærmest toppen returneres. Elementet som er på toppen av bunken anses å være i posisjon 1.

Hvis objektet ikke blir funnet, Søk() vil returnere -1.

6.2. Få indeks over element

For å få en indeks over et element på Sstift, vi kan også bruke oversikt over() og lastIndexOf () metoder:

@Test offentlig ugyldig nårElementIsOnStack_thenIndexOfReturnsItsIndex () {Stack intStack = new Stack (); intStack.push (5); int indexOf = intStack.indexOf (5); assertEquals (0, indexOf); }

DelastIndexOf () vil alltid finne indeksen til elementet som er nærmest toppen av bunken. Dette fungerer veldig likt Søk() - med den viktige forskjellen at den returnerer indeksen, i stedet for avstanden fra toppen:

@Test offentlig ugyldig nårMultipleElementsAreOnStack_thenIndexOfReturnsLastElementIndex () {Stack intStack = new Stack (); intStack.push (5); intStack.push (5); intStack.push (5); int lastIndexOf = intStack.lastIndexOf (5); assertEquals (2, lastIndexOf); }

7. Fjern elementer fra en bunke

Bortsett fra pop () operasjon, brukt både for fjerning og henting av elementer, kan vi også bruke flere operasjoner arvet fra Vector klasse for å fjerne elementer.

7.1. Fjerne spesifiserte elementer

Vi kan bruke removeElement () metode for å fjerne den første forekomsten av det gitte elementet:

@Test offentlig ugyldig nårRemoveElementIsInvoked_thenElementIsRemoved () {Stack intStack = new Stack (); intStack.push (5); intStack.push (5); intStack.removeElement (5); assertEquals (1, intStack.size ()); }

Vi kan også bruke removeElementAt () for å slette elementer under en spesifisert indeks i Stable:

 @Test offentlig ugyldig nårRemoveElementAtIsInvoked_thenElementIsRemoved () {Stack intStack = new Stack (); intStack.push (5); intStack.push (7); intStack.removeElementAt (1); assertEquals (-1, intStack.search (7)); }

7.2. Fjerne flere elementer

La oss se raskt på hvordan du fjerner flere elementer fra en Stable bruker Fjern alle() API - som vil ta en Samling som et argument og fjern alle samsvarende elementer fra Stable:

@Test public void givenElementsOnStack_whenRemoveAllIsInvoked_thenAllElementsFromCollectionAreRemoved () {Stack intStack = new Stack (); List intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); intStack.addAll (intList); intStack.add (500); intStack.removeAll (intList); assertEquals (1, intStack.size ()); assertEquals (1, intStack.search (500)); }

Det er også mulig å Fjern alle elementene fra Stable bruker klar() eller removeAllElements () metoder; begge metodene fungerer likt:

@Test offentlig ugyldig nårRemoveAllElementsIsInvoked_thenAllElementsAreRemoved () {Stack intStack = new Stack (); intStack.push (5); intStack.push (7); intStack.removeAllElements (); assertTrue (intStack.isEmpty ()); }

7.3. Fjerne elementer ved hjelp av filter

Vi kan også bruke en betingelse for å fjerne elementer fra Stable. La oss se hvordan du gjør dette ved hjelp av fjerneHvis(), med et filteruttrykk som argument:

@Test offentlig ugyldig nårRemoveIfIsInvoked_thenAllElementsSatysfyingConditionAreRemoved () {Stack intStack = new Stack (); List intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); intStack.addAll (intList); intStack.removeIf (element -> element <6); assertEquals (2, intStack.size ()); }

8. Iterere over en bunke

Stable tillater oss å bruke både en Iterator og en ListIterator. Hovedforskjellen er at den første lar oss krysse Stable i en retning og andre lar oss gjøre dette i begge retninger:

@Test offentlig ugyldig nårAnotherStackCreatedWhileTraversingStack_thenStacksAreEqual () {Stack intStack = new Stack (); List intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); intStack.addAll (intList); ListIterator it = intStack.listIterator (); Stack result = new Stack (); mens (it.hasNext ()) {result.push (it.next ()); } assertThat (result, equalTo (intStack)); }

Alle Iteratorer returnert av Stable er feilrask.

9. Stream API for Java Stack

Stable er en samling, noe som betyr at vi kan bruke den med Java 8 Strømmer API. Ved hjelp av Strøm med Stable ligner på å bruke den med andre Samling:

@Test offentlig ugyldig nårStackIsFiltered_allElementsNotSatisfyingFilterConditionAreDiscarded () {Stack intStack = new Stack (); List inputIntList = Arrays.asList (1, 2, 3, 4, 5, 6, 7, 9, 10); intStack.addAll (inputIntList); Liste filtrert = intStack .stream () .filter (element -> element <= 3) .collect (Collectors.toList ()); assertEquals (3, filtered.size ()); }

10. Sammendrag

Denne opplæringen er en rask og praktisk guide for å forstå denne kjerneklassen i Java Stable.

Selvfølgelig kan du utforske hele API-et i Javadoc.

Og som alltid kan alle kodeeksempler finnes på GitHub.