Fail Fail Fast and Fail Safe Iterators Java: Mikä on ero?



Tämä artikkeli 'Fail Fast and Fail Safe Iterators' auttaa sinua vertaamaan näitä kahta iteraattoria yksityiskohtaisesti asiaankuuluvien esimerkkien kanssa.

tukee kahden tyyppisiä iteraattoreita, joista ensimmäinen epäonnistuu nopeasti ja toinen epäonnistuu. Näillä on tärkeä rooli Java-poikkeusten käsittelyssä. Tässä artikkelissa ”Fail Fast and Fail Safe Iterators” analysoidaan kahden iteraattorin toimintaa sekä niiden välistä olennaista eroa.

Seuraavassa on tässä artikkelissa käsiteltäviä vinkkejä:





Ennen kuin pääset yksityiskohtaiseen selitykseen, tutustu samanaikaisen muokkauksen käsitteeseen.

Samanaikainen muokkaus

Kun yksi ketju (tai useita ketjuja) toistuu kokoelman yli, se voi muuttaa kokoelman rakennetta joko lisäämällä tai poistamalla kokoelman elementin tai päivittämällä elementin arvon tietyssä paikassa. Tätä prosessia kutsutaan samanaikaiseksi modifikaatioksi.



Katsotaanpa nopeasti kaksi yllä olevaa aihetta käsittelevää järjestelmää, ennen kuin käsittelemme saman yksityiskohtia,

Epäonnistunut nopea järjestelmä:

Järjestelmä on merkitty epäonnistuneeksi järjestelmäksi, jos se sammuu heti virheen esiintymisen jälkeen. Toiminnot keskeytetään välittömästi ja viat tai virheet paljastuvat.

Epäonnistunut järjestelmä:

Järjestelmä on merkitty vikaturvalliseksi, jos se jatkaa toimintaansa myös vian tai virheen jälkeen. He eivät keskeytä toimintoa ja piilottavat virheet paljastamisen sijaan.



Java-iteraattorit antavat meille mahdollisuuden kulkea kokoelma-esineiden yli. Kokoelman palauttamat iteraattorit ovat joko epäonnistuneita tai epäonnistuneita.

Epäonnistuu nopeasti iteraattori

Epäonnistuneet Java-iteraattorit estävät kaikenlaisia ​​rakennemuutoksia kokoelmalle iteroimalla niitä. Rakennemuutos sisältää minkä tahansa kokoelman elementin lisäämisen, poistamisen tai päivittämisen iteroimalla sitä. Iteraattori heittää ConcurrentModificationExceptionin, jos kokoelmaa muokataan rakenteellisesti iterointiprosessin aikana.

On kuitenkin huomattava, että jos kohde poistetaan iteraattoreiden omalla menetelmällä, eli Remove () -menetelmällä, mitään poikkeusta ei heitetä. Se on täysin turvallinen prosessi. varmista, että sinulla on java asennettuna järjestelmässäsi

Esimerkki epäonnistuneesta iteraattorista:

Tuo java.util.HashMap Tuo java.util.Iterator tuo java.util.Map julkinen luokka FailFastExample {public static void main (String [] args) {Map monthIndex = new HashMap () monthIndex.put ('1', 'tammikuu ') monthIndex.put (' 2 ',' helmikuu ') monthIndex.put (' 3 ',' March ') Iteraattori iteraattori = monthIndex.keySet (). iterator () while (iterator.hasNext ()) {System.out .println (monthIndex.get (iterator.next ())) // elementin lisääminen Mapiin // poikkeus heitetään seuraavan () -metodin seuraavaan puheluun //. monthIndex.put ('4', 'huhtikuu')}}}

Tuotos:

Poikkeus säikeessä “main” java.util.ConcurrentModificationException

osoitteessa java.util.HashMap $ HashIterator.nextEntry (Tuntematon lähde)

Katsokaamme nyt Fail Safe Iteratoria,

Fail Safe Iterator

Toisin kuin Fail Fast iteraattorit, Fail Safe iteraattorit eivät tee mitään poikkeuksia, jos kokoelmaa muokataan iterointiprosessin aikana. Tämä johtuu siitä, että ne toistuvat kokoelman kloonilla varsinaisen kokoelman sijaan. Varsinaiseen kokoelmaan tehdyt rakenteelliset muutokset jäävät huomaamatta.

On kuitenkin huomattava, että ei ole olemassa sellaista asiaa kuin todella Fail Safe Iterator. Olisi asianmukaista kutsua se heikosti johdonmukaiseksi. Tämä tarkoittaa yksinkertaisesti sitä jos Kokoelmaa muokataan iterointiprosessin aikana, minkä iteraattorin mielestä taataan heikosti. Tämä käyttäytyminen eroaa eri kokoelmissa, ja se on dokumentoitu Javadocsissa.

Esimerkki epäonnistuneesta iteraattorista:

public class FailSafeExample {public static void main (String [] args) {ConcurrentMap monthIndex = new ConcurrentHashMap () monthIndex.put ('1', 'tammikuu') monthIndex.put ('2', 'helmikuu') monthIndex.put ( '3', 'maaliskuu') Iterator iterator = monthIndex.keySet (). Iterator () while (iterator.hasNext ()) {System.out.println (monthIndex.get (iterator.next ())) monthIndex.put ( 4, huhtikuu)}}}

Tuotos:

  • tammikuu
  • helmikuu
  • Maaliskuu

Lopuksi tässä artikkelissa vertailemme näitä iteraattoreita,

Erot: Fail Fail Fast and Fail Safe Iterator

Alla on esitetty olennaiset erot kahden iteraattorin välillä:

merkkijono menetelmä java
Parametrit Epäonnistuu nopeasti iteraattori Fail Safe Iterator
Heitä samanaikainen muokkauspoikkeus

Kyllä, he heittävät CocurrentModificationExcepti-päälle, jos kokoelmaa muokataan iteroimalla sitä.

Ei, he eivät tee mitään poikkeusta, jos kokoelmaa muokataan iteroimalla sitä.

Kloonaa kokoelma

Ei, he käyttävät alkuperäistä kokoelmaa siirtyäkseen elementtien yli.

Kyllä, he käyttävät alkuperäisen kokoelman kopiota liikkumiseen.

Muisti yläpuolella

Ei, ne eivät vaadi ylimääräistä muistia.

Kyllä, ne vaativat ylimääräistä muistia kokoelman kloonaamiseksi.

Esimerkkejä

HashMap, Vector, ArrayList, HashSet

CopyOnWriteArrayList

Nämä iteraattorit ovat sekä ainutlaatuisia että kaivattuja javan monipuolisella kielellä. Vaikka vikaturvallisella on lohdullinen rengas, vikaantumaton iteraattori osoittautuu vankaksi.

Tämä tuo tämän artikkelin loppuun. Jos haluat oppia lisää, tutustu kirjoittanut Edureka. Edurekan Java J2EE- ja SOA-koulutus- ja sertifiointikurssit on suunniteltu antamaan sinulle etumatka Java-ohjelmointiin ja kouluttamaan sekä ydin- että edistyneitä Java-konsepteja sekä erilaisia ​​Java-kehyksiä, kuten Hibernate & Spring.

Onko sinulla kysymys meille? Mainitse se tämän 'Fail Fast vs Fail Safe' -blogin kommenttiosassa ja otamme sinuun yhteyttä mahdollisimman pian.