Programiranje

Java Map.get in Map.containsKey

Pri uporabi implementacij Java's Map je včasih običajno uporabiti Zemljevidget (Object) in različno reagiranje glede na to, ali je vrnjena vrednost nična ali ne. Lahko se domneva, da nična vrednost, vrnjena iz Map.get (Object), pomeni, da na zemljevidu ni vnosa s predloženim ključem, vendar to ni vedno tako. Dejansko, če Java Zemljevid izvedba omogoča ničelne vrednosti, potem je to mogoče za Zemljevid da vrne njegovo vrednost za dani ključ, vendar je ta vrednost lahko nična. Pogosto to ni pomembno, če pa je, lahko uporabimo Map.containsKey (), da ugotovimo, ali Zemljevid vnos ima ključni vnos. Če se, in Zemljevid vrne nič pri klicu za pridobitev iste ključe, potem je verjetno, da se ključ preslika v a nič vrednost. Z drugimi besedami, to Zemljevid lahko vrne "true" za vsebujeKey (objekt) hkrati pa se vrača " nič"za get (objekt). Nekaj ​​jih je Zemljevid izvedbe, ki ne dovoljujejo nič vrednote. V teh primerih a nič iz klica "get" se mora dosledno ujemati z "false" vrnitvijo iz metode "containsKey".

V tem prispevku na blogu predstavim te vidike Map.get (objekt) in Map.containsKey (objekt). Preden se lotim te predstavitve, bom najprej poudaril, da dokumentacija Javadoc za Map.get (Object) izrecno opozarja na tanke razlike med Map.get (objekt) in Map.containsKey (objekt):

Če ta zemljevid dovoljuje ničelne vrednosti, potem vrne vrednost nič ne pomeni nujno, da zemljevid ne vsebuje preslikave ključa; možno je tudi, da zemljevid izrecno preslika ključ nič. The vsebujeKljuč ta dva primera lahko uporabimo za ločevanje.

Za primere v prispevku bom uporabil naslednji seznam države:

Države.java

paket prah v.primeri; / ** * Enum predstavlja izbrane zahodne zvezne države v Združenih državah. * / države javnega naštevanja {ARIZONA ("Arizona"), KALIFORNIJA ("Kalifornija"), COLORADO ("Kolorado"), IDAHO ("Idaho"), KANSAS ("Kansas"), MONTANA ("Montana"), NEVADA ( "Nevada"), NEW_MEXICO ("Nova Mehika"), NORTH_DAKOTA ("Severna Dakota"), OREGON ("Oregon"), SOUTH_DAKOTA ("Južna Dakota"), UTAH ("Utah"), WASHINGTON ("Washington"), WYOMING ("Wyoming"); / ** Ime države. * / private String stateName; / ** * Parametriziran konstruktor enum, ki sprejema ime stanja. * * @param newStateName Ime države. * / Države (končni niz newStateName) {this.stateName = newStateName; } / ** * Navedite ime države. * * @return Ime države * / public String getStateName () {return this.stateName; }} 

Naslednji seznam kod uporablja zgornji enum in naseljuje zemljevid držav do njihovih glavnih mest. Metoda sprejema razred, ki bi moral biti posebna izvedba zemljevida, ki ga je treba ustvariti in zapolniti.

generirajStatesMap (razred)

/ ** * Ustvarite in zapolnite Zemljevid držav v prestolnice z navedenim tipom zemljevida. * Ta metoda beleži tudi vse izvedbe zemljevida, za katere ničelne vrednosti * niso dovoljene. * * @param mapClass Vrsta zemljevida, ki ga je treba ustvariti. * @return Zemljevid držav do prestolnic. * / zasebni statični zemljevid generirajStatesMap (Class mapClass) {Map mapToPopulate = null; if (Map.class.isAssignableFrom (mapClass)) {poskusite {mapToPopulate = mapClass! = EnumMap.class? (Zemljevid) mapClass.newInstance (): getEnumMap (); mapToPopulate.put (States.ARIZONA, "Phoenix"); mapToPopulate.put (States.CALIFORNIA, "Sacramento"); mapToPopulate.put (States.COLORADO, "Denver"); mapToPopulate.put (States.IDAHO, "Boise"); mapToPopulate.put (States.NEVADA, "Carson City"); mapToPopulate.put (States.NEW_MEXICO, "Sante Fe"); mapToPopulate.put (States.NORTH_DAKOTA, "Bismark"); mapToPopulate.put (States.OREGON, "Salem"); mapToPopulate.put (States.SOUTH_DAKOTA, "Pierre"); mapToPopulate.put (States.UTAH, "Salt Lake City"); mapToPopulate.put (States.WASHINGTON, "Olympia"); mapToPopulate.put (States.WYOMING, "Cheyenne"); poskusite {mapToPopulate.put (States.MONTANA, null); } catch (NullPointerException npe) {LOGGER.severe (mapToPopulate.getClass (). getCanonicalName () + "ne dovoljuje ničelnih vrednosti -" + npe.toString ()); }} catch (InstantiationException instantiationException) {LOGGER.log (Level.SEVERE, "Zemljevid tipa ni mogoče ustvariti" + mapClass.getName () + instantiationException.toString (), instantiationException); } catch (IllegalAccessException nezakonitAccessException) {LOGGER.log (Level.SEVERE, "Dostop do zemljevida vrste" + mapClass.getName () + nezakonitAccessException.toString (), nezakonitAccessException); }} else {LOGGER.warning ("Navedeni tip podatkov" + mapClass.getName () + "ni zemljevid."); } return mapToPopulate; } 

Zgornjo metodo lahko uporabimo za ustvarjanje različnih vrst zemljevidov. Kode trenutno ne prikazujem, vendar moj primer ustvari te zemljevide s štirimi specifičnimi izvedbami: HashMap, LinkedHashMap, ConcurrentHashMap in EnumMap. Nato se vsaka od teh štirih izvedb zažene skozi metodo demonstrateGetAndContains (Zemljevid), ki je prikazan naslednji.

demonstrateGetAndContains (Zemljevid)

/ ** * Demonstrirajte Map.get (Države) in Map.containsKey (Države). * * @param map Zemljevid, na katerem je treba izvesti demonstracijo. * / private static void demonstrateGetAndContains (končni zemljevid zemljevida) {final StringBuilder demoResults = new StringBuilder (); končni niz mapType = map.getClass (). getCanonicalName (); končne države montana = države.MONTANA; demoResults.append (NEW_LINE); demoResults.append ("Zemljevid tipa" + mapType + "vrne" + (map.get (montana)) + "za Map.get () z uporabo" + montana.getStateName ()); demoResults.append (NEW_LINE); demoResults.append ("Zemljevid tipa" + mapType + "vrne" + (map.containsKey (montana)) + "za Map.containsKey () z uporabo" + montana.getStateName ()); demoResults.append (NEW_LINE); končne države kansas = države.KANSAS; demoResults.append ("Zemljevid tipa" + mapType + "vrne" + (map.get (kansas)) + "za Map.get () z uporabo" + kansas.getStateName ()); demoResults.append (NEW_LINE); demoResults.append ("Zemljevid tipa" + mapType + "vrne" + (map.containsKey (kansas)) + "za Map.containsKey () z uporabo" + kansas.getStateName ()); demoResults.append (NEW_LINE); LOGGER.info (demoResults.toString ()); } 

Za to predstavitev sem namerno nastavil Zemljevide, da imajo ničelne vrednosti kapitala za Montano, da v Kansasu sploh ni vnosa. To pomaga prikazati razlike v Map.get (objekt) in Map.containsKey (objekt). Ker vsaka vrsta izvedbe Zemljevida ne omogoča ničelnih vrednosti, sem del, ki Montano postavi brez začetnice, obdal znotraj bloka try / catch.

Rezultati izvajanja štirih vrst Zemljevidov skozi kodo so prikazani v nadaljevanju.

17. avgust 2010 23:23:26 dustin.examples.MapContainsGet logMapInfo INFO: HashMap: {MONTANA = null, WASHINGTON = Olympia, ARIZONA = Phoenix, CALIFORNIA = Sacramento, WYOMING = Cheyenne, SOUTH_DAKOTO = Pierre, New York, Denver, Pierre = Sante Fe, NORTH_DAKOTA = Bismark, NEVADA = Carson City, OREGON = Salem, UTAH = Salt Lake City, IDAHO = Boise} 17. avgust 2010 23:23:26 dustin.examples.MapContainsGet demonstrateGetAndContains INFO: Zemljevid tipa java. util.HashMap vrne null za Map.get () z uporabo zemljevida Montana vrste java.util.HashMap vrne true za Map.containsKey () z uporabo zemljevida Montana vrste java.util.HashMap vrne null za Map.get () z uporabo zemljevida Kansas tipa java.util.HashMap vrne false za Map.containsKey () z uporabo Kansasa 17. avgusta 2010 23:23:26 dustin.examples.MapContainsGet logMapInfo INFO: LinkedHashMap: {ARIZONA = Phoenix, CALIFORNIA = Sacramento, COLORADO = Denver, IDAHO = Boise, NEVADA = Carson City, NEW_MEXICO = Sante Fe, NORTH_DAKOTA = Bismark, OREGON = Salem, SOUTH_DAKOTA = Pierre, UTAH = Salt Lake City, WASHINGTON = Olympia, WYOMING = Cheyenne, MONTANA = null} 17. avgust 2010 23:23:26 dustin.examples.MapContainsGet demonstrateGetAndContains INFO: Zemljevid tipa java.util.LinkedHashMap vrne null za Map.get () z uporabo zemljevida Montana vrste java .util.LinkedHashMap vrne true za Map.containsKey () z uporabo zemljevida Montana vrste java.util.LinkedHashMap vrne null za Map.get () z uporabo Kansas Zemljevid tipa java.util.LinkedHashMap vrne false za Map.containsKey () z uporabo Kansas 17. avgust 2010 23:23:26 dustin.examples.MapContainsGet createStatesMap SEVERE: java.util.concurrent.ConcurrentHashMap ne dovoljuje ničelnih vrednosti - java.lang.NullPointerException 17. avgust 2010 23:23:26 dustin.examples .MapContainsGet logMapInfo INFO: ConcurrentHashMap: {SOUTH_DAKOTA = Pierre, ARIZONA = Phoenix, WYOMING = Cheyenne, UTAH = Salt Lake City, OREGON = Salem, CALIFORNIA = Sacramento, IDAHO = Boise, NEW_OROTEX = Boise, NEW_OROTE = NORTH = Fever , WASHINGTON = Olympia, NEVADA = Carson City} 17. avgust 2010 23:23:26 dustin.examples.Ma pContainsGet demonstrateGetAndContains INFO: Zemljevid tipa java.util.concurrent.ConcurrentHashMap vrne null za Map.get () z uporabo Montane Zemljevid tipa java.util.concurrent.ConcurrentHashMap vrne false za Map.containsKey () z uporabo zemljevida Montana vrste java.util .concurrent.ConcurrentHashMap vrne null za Map.get () z uporabo Kansas Map vrste java.util.concurrent.ConcurrentHashMap vrne false za Map.containsKey () z uporabo Kansas 17. avgusta 2010 23:23:26 dustin.examples.MapContainsGet logMapInfo INFO: EnumMap: {ARIZONA = Phoenix, CALIFORNIA = Sacramento, COLORADO = Denver, IDAHO = Boise, MONTANA = null, NEVADA = Carson City, NEW_MEXICO = Sante Fe, NORTH_DAKOTA = Bismark, OREGON = Salem, SOM, SOD Lake City, WASHINGTON = Olympia, WYOMING = Cheyenne} 17. avgust 2010 23:23:26 dustin.examples.MapContainsGet demonstrateGetAndContains INFO: Zemljevid tipa java.util.EnumMap vrne null za Map.get () z uporabo Montana Map type java.util.EnumMap vrne true za Map.containsKey () z uporabo Montana Map of ty pe java.util.EnumMap vrne null za Map.get () z uporabo Kansas Map vrste java.util.EnumMap vrne false za Map.containsKey () z uporabo Kansas 

Za tri vrste zemljevidov, za katere sem lahko vnesel ničelne vrednosti, klic Map.get (Object) vrne nič, tudi če metoda containsKey (Object) vrne "true" za Montano, ker sem ta ključ dal na zemljevid brez vrednost. Za Kansas so rezultati dosledno Map.get () vrne nič in Map.containsKey () vrne "false", ker v Maps for Kansas sploh ni nobenega vnosa.

Zgornji rezultat tudi dokazuje, da nisem mogel vnesti ničelne vrednosti za kapital Montane v ConcurrentHashMap izvedba (vržen je bil NullPointerException).

17. avgust 2010 23:23:26 dustin.examples.MapContainsGet generirajStatesMapSEVERE: java.util.concurrent.ConcurrentHashMap ne dovoljuje ničelnih vrednosti - java.lang.NullPointerException

To je imelo stranski učinek ohranjanja Map.get (objekt) in Map.containsKey (objekt) bolj dosledne ustrezne vrednosti ničelne in napačne vrnitve. Z drugimi besedami, nemogoče je bilo, da bi bil ključ na zemljevidu, ne da bi imel ustrezno ničelno vrednost.

V mnogih primerih je uporaba Map.get (objekt) deluje po potrebi za določene potrebe, vendar je najbolje vedeti, da obstajajo razlike med Map.get (objekt) in Map.containsKey (objekt) da zagotovite, da se vedno uporablja ustrezen. Zanimivo je tudi, da ima Map podoben podatek vsebujeVrednost (objekt) metoda.

Za popolnost sem tukaj navedel celoten seznam kod za razred MapContainsGet:

MapContainsGet.java

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