Programavimas

„Java Map.get“ ir „Map.contains Key“

Naudojant „Java“ žemėlapio diegimą, kartais įprasta iškviesti Žemėlapisgauti (objekto) metodą ir reaguoti skirtingai, atsižvelgiant į tai, ar grąžinama vertė yra nulinė, ar ne. Galima daryti bendrą prielaidą, kad nulinis, gautas iš Map.get (Object), rodo, kad žemėlapyje nėra įrašo su pateiktu raktu, tačiau taip nėra visada. Iš tiesų, jei „Java“ Žemėlapis diegimas leidžia nulines vertes, tada yra įmanoma Žemėlapis kad grąžintų jo duoto rakto vertę, tačiau ši reikšmė gali būti nulis. Dažnai tai neturi reikšmės, tačiau jei taip, tai galima naudoti Map.containsKey (), kad nustatytumėte, ar Žemėlapis įrašas turi raktinį įrašą. Jei taip ir Žemėlapis grįžta niekinis skambinant tam pačiam raktui, tikėtina, kad raktas susiejamas su a niekinis vertė. Kitaip tariant, kad Žemėlapis gali grįžti „tiesa“ už yraKey (objektas) tuo pačiu grįždamas " niekinis" dėl gauti (objektas). Yra šiek tiek Žemėlapis diegimai, kurie neleidžia niekinis vertybes. Tais atvejais a niekinis iš „get“ skambučio turėtų nuosekliai atitikti „false“ grąžą iš „containsKey“ metodo.

Šiame tinklaraščio įraše aš pademonstruoju šiuos Map.get (objektas) ir Map.containsKey (Object). Prieš eidamas į tą demonstraciją pirmiausia atkreipsiu dėmesį į tai, kad „Map.get“ („Object“) „Javadoc“ dokumentai aiškiai įspėja apie subtilius skirtumus tarp Map.get (objektas) ir Map.containsKey (Object):

Jei šiame žemėlapyje leidžiamos nulinės vertės, tada grąžinama vertė yra niekinis nebūtinai nurodo, kad žemėlapyje nėra rakto atvaizdavimo; taip pat gali būti, kad žemėlapis aiškiai nurodo raktą niekinis. yraKey operacija gali būti naudojama šiems dviem atvejams atskirti.

Įrašo pavyzdžiuose naudosiu valstybes, kurios apibrėžtos toliau:

Valstybės.java

pakuotė dustin.pavyzdžiai; / ** * „Enum“, atstovaujantis pasirinktoms Vakarų valstybėms Jungtinėse Valstijose. * / valstybinės enume valstijos {ARIZONA („Arizona“), KALIFORNIJA („Kalifornija“), COLORADO („Koloradas“), IDAHO („Aidahas“), KANSAS („Kanzasas“), MONTANA („Montana“), NEVADA ( „Nevada“), NEW_MEXICO („Naujoji Meksika“), NORTH_DAKOTA („Šiaurės Dakota“), OREGON („Oregonas“), SOUTH_DAKOTA („Pietų Dakota“), JUTOS („Juta“), WASHINGTON („Vašingtonas“), WYOMING („Vajomingas“); / ** Valstybės pavadinimas. * / privati ​​eilutė stateName; / ** * Parametruotas enumo konstruktorius, priimantis valstybės pavadinimą. * * @param newStateName Valstybės pavadinimas. * / Būsenos (galutinė eilutė newStateName) {this.stateName = newStateName; } / ** * Nurodykite valstijos pavadinimą. * * @return Valstybės pavadinimas * / public String getStateName () {return this.stateName; }} 

Kitame kodų sąraše naudojamas aukščiau pateiktas sąrašas ir pateikiamas valstybių žemėlapis su jų sostinėmis. Metodas priima klasę, kuri turėtų būti konkretus „Map“, kurį reikia sukurti ir užpildyti, įgyvendinimas.

generuoti valstybės žemėlapį (klasė)

/ ** * Sukurkite ir užpildykite valstybių žemėlapį iki sostinių su nurodytu žemėlapio tipu. * Šis metodas taip pat registruoja visus žemėlapio diegimus, kurių nulinės vertės * neleidžiamos. * * @param mapClass Generuojamo žemėlapio tipas. * @return Valstijų žemėlapis į sostines. * / privatus statinis žemėlapis generateStatesMap (klasės mapClass) {Žemėlapio mapToPopulate = null; if (Map.class.isAssignableFrom (mapClass)) {pabandykite {mapToPopulate = mapClass! = EnumMap.class? (Žemėlapis) mapClass.newInstance (): getEnumMap (); mapToPopulate.put (valstijos.ARIZONA, „Finiksas“); mapToPopulate.put (valstijos.KALIFORNIJA, "Sakramentas"); mapToPopulate.put (valstijos.COLORADO, "Denveris"); mapToPopulate.put (valstijos.IDAHO, „Boise“); mapToPopulate.put (valstijos.NEVADA, "Karsono miestas"); mapToPopulate.put (valstijos.NEW_MEXICO, "Sante Fe"); mapToPopulate.put (valstijos.NORTH_DAKOTA, "Bismark"); mapToPopulate.put (valstijos.OREGONAS, „Salemas“); mapToPopulate.put (valstijos.SOUTH_DAKOTA, "Pierre"); mapToPopulate.put (valstijos.UTAH, "Solt Leik Sitis"); mapToPopulate.put (valstijos.WASHINGTON, „Olympia“); mapToPopulate.put (valstijos.WYOMING, „Cheyenne“); pabandykite {mapToPopulate.put (valstijos.MONTANA, niekinis); } catch (NullPointerException npe) {LOGGER.severe (mapToPopulate.getClass (). getCanonicalName () + "neleidžia rodyti nulinių verčių -" + npe.toString ()); }} catch („InstantiationException instantiationException“) {LOGGER.log (Level.SEVERE, „Nepavyko užfiksuoti tipo žemėlapio“ + mapClass.getName () + instantiationException.toString (), instantiationException); } catch (IllegalAccessExceptionegalAccessException) {LOGGER.log (Level.SEVERE, "Nepavyko pasiekti tipo žemėlapio" + mapClass.getName () + neteisėtasAccessException.toString (), neteisėtasAccessException); }} else {LOGGER.warning ("Pateiktas duomenų tipas" + mapClass.getName () + "nėra žemėlapis."); } grįžti mapToPopulate; } 

Aukščiau pateiktą metodą galima naudoti įvairių rūšių žemėlapiams generuoti. Šiuo metu nerodau kodo, bet mano pavyzdžiu sukuriami šie žemėlapiai su keturiais konkrečiais diegimais: „HashMap“, „LinkedHashMap“, „ConcurrentHashMap“ ir „EnumMap“. Kiekvienas iš šių keturių diegimų vykdomas taikant metodą demonstruoti „GetAndContains“ (žemėlapis), kuris rodomas toliau.

demonstruoti „GetAndContains“ (žemėlapis)

/ ** * Parodykite Map.get (valstijos) ir Map.containsKey (valstijos). * * @param map Žemėlapis, kuriame turėtų būti vykdoma demonstracija. * / private static void demonstrateGetAndContains (galutinis žemėlapio žemėlapis) {final StringBuilder demoResults = new StringBuilder (); final String mapType = map.getClass (). getCanonicalName (); final state montana = Valstijos.MONTANA; demoResults.append (NEW_LINE); demoResults.append ("Tipo žemėlapis" + mapType + "grąžina" + (map.get (montana)) + "Map.get () naudodamas" + montana.getStateName ()); demoResults.append (NEW_LINE); demoResults.append ("Tipo žemėlapis" + mapType + "grąžina" + (map.containsKey (montana)) + ", skirtas Map.containsKey () naudojant" + montana.getStateName ()); demoResults.append (NEW_LINE); final States kansas = valstijos.KANSAS; demoResults.append ("Tipo žemėlapis" + mapType + "grąžina" + (map.get (kansas)) + "Map.get () naudodamas" + kansas.getStateName ()); demoResults.append (NEW_LINE); demoResults.append ("Tipo žemėlapis" + mapType + "grąžina" + (map.containsKey (kansas)) + ", skirtas Map.containsKey () naudojant" + kansas.getStateName ()); demoResults.append (NEW_LINE); LOGGER.info (demoResults.toString ()); } 

Šiai demonstracijai aš sąmoningai sukūriau Žemėlapius, kad Montanoje būtų nulinės kapitalo vertės, kad Kanzasas neturėtų jokio įrašo. Tai padeda parodyti Map.get (objektas) ir Map.containsKey (Object). Kadangi ne kiekviename Žemėlapio įgyvendinimo tipe leidžiamos nulinės vertės, aš apsupau dalį, kurioje Montana be didžiosios raidės įrašyta į bandymo / gaudymo bloką.

Toliau pasirodys keturių tipų Žemėlapių paleidimo per kodą rezultatai.

2010 m. Rugpjūčio 17 d. 23:23:26 dustin.examples.MapContainsGet logMapInfo INFO: HashMap: {MONTANA = null, WASHINGTON = Olympia, ARIZONA = Phoenix, CALIFORNIA = Sacramento, WYOMING = Cheyenne, SOUTH_DAKAD_MENOR = Pjeras, COLER = Sante Fe, NORTH_DAKOTA = Bismark, NEVADA = Carson City, OREGON = Salem, UTAH = Solt Leik Sitis, IDAHO = Boise} 2010 m. Rugpjūčio 17 d. 23:23:26 dustin.examples.MapContainsGet demonstrGetAndContains INFO: Java tipo žemėlapis. Naud.HashMap grąžina nulį Map.get () naudodamas Montana Map tipą java.util.HashMap grąžina true Map.containsKey () naudodamas Montana Map tipą java.util.HashMap grąžina nulį Map.get () naudodamas Kanzaso žemėlapį tipo java.util.HashMap grąžina klaidingą reikšmę Map.containsKey () naudodamas Kanzasą 2010 m. rugpjūčio 17 d. 11: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 = Solt Leik Sitis, WASHINGTON = Olympia, WYOMING = Cheyenne, MONTANA = null} 2010 m. Rugpjūčio 17 d. 23:23:26 dustin.examples.MapContainsGet demonstrGetAndContains INFO: Tipo žemėlapis java.util.LinkedHashMap grąžina nulį Map.get () naudojant Montanos java tipo žemėlapį .util.LinkedHashMap grąžina reikšmę Map.containsKey (), naudodamas java.util tipo Montana žemėlapį 2010 m. Rugpjūčio 17 d. 23:23:26 dustin.examples.MapContainsGet generateStatesMap SEVERE: java.util.concurrent.ConcurrentHashMap neleidžia nulinių verčių - java.lang.NullPointerException 2010 m. Rugpjūčio 17 d. 23:23:26 dustin.examples .MapContainsGet logMapInfo INFO: ConcurrentHashMap: {SOUTH_DAKOTA = Pierre, ARIZONA = Phoenix, WYOMING = Cheyenne, UTAH = Solt Leik Sitis, OREGON = Salem, CALIFORNIA = Sacramento, IDAHO = Boise, NEW_MAKERAS, NEW_MEXICO , WASHINGTON = Olympia, NEVADA = Carson City} 2010 m. Rugpjūčio 17 d. 23:23:26 dustin.examples.Ma pContainsGet demonstrGetAndContains INFO: tipo java.util.concurrent.ConcurrentHashMap žemėlapis grąžina nulį Map.get () naudodamas Montanos žemėlapį tipo java.util.concurrent.ConcurrentHashMap grąžina klaidingą Map.containsKey () naudodamas Montana java.util tipo žemėlapį .concurrent.ConcurrentHashMap grąžina nulį Map.get () naudodamas Kanzaso žemėlapio tipą java.util.concurrent.ConcurrentHashMap grąžina klaidingą reikšmę Map.containsKey () naudodamas Kanzasą 2010 m. rugpjūčio 17 d. 23:23:26 dustin.examples.MapContainsGet logMapInfo INFORMACIJA: „EnumMap“: {ARIZONA = Feniksas, KALIFORNIJA = Sakramentas, COLORADO = Denveris, IDAHO = Boizė, MONTANA = null, NEVADA = Carson City, NEW_MEXICO = Sante Fe, NORTH_DAKOTA = Bismark, OREGON = Salem, SOUTH = SOUTH_AK Leik Sitis, WASHINGTON = Olympia, WYOMING = Cheyenne} 2010 m. Rugpjūčio 17 d. 23:23:26 dustin.examples.MapContainsGet demonstrGetAndContains INFO: tipo žemėlapis java.util.EnumMap grąžina nulį Map.get () naudojant Montanos tipo žemėlapį. Java.util.EnumMap grąžina „Map.containsKey ()“ reikšmę, naudodama „Montana Map of ty“ pe java.util.EnumMap grąžina nulį Map.get () naudodamas Kanzasą, naudodamas Kanzaso žemėlapį Tipo java.util.EnumMap grąžina klaidingą Map.containsKey () naudodamas Kanzasą 

Trijų žemėlapių tipų, kuriems galėjau įvesti nulines reikšmes, iškvietimas Map.get (Object) grąžinamas į nulį, net jei „SisKey“ (objektas) metodas Montanai grąžina „true“, nes aš įdėjau tą raktą į žemėlapį be vertė. Kanzaso rezultatai yra nuolatiniai: Map.get () grąžina nulį, o Map.containsKey () - „false“, nes „Kansas“ žemėlapiuose nėra jokio įrašo.

Aukščiau pateiktas rezultatas taip pat parodo, kad negalėjau į „Montana“ kapitalą įtraukti nulinės vertės „ConcurrentHashMap“ diegimas (buvo išmestas „NullPointerException“).

2010 m. Rugpjūčio 17 d. 23:23:26 dustin.examples.MapContainsGet generateStatesMapSEVERE: java.util.concurrent.ConcurrentHashMap neleidžia nustatyti nulinių verčių - java.lang.NullPointerException

Tai turėjo šalutinį išlaikymo efektą Map.get (objektas) ir Map.containsKey (Object) nuoseklesnės atitinkamos nulinės ir klaidingos grąžinimo vertės. Kitaip tariant, neįmanoma, kad raktas būtų žemėlapyje, neturint atitinkamos nulio vertės.

Daugeliu atvejų naudojimas Map.get (objektas) veikia taip, kaip reikia atsižvelgiant į konkrečius poreikius, tačiau geriausia atsiminti, kad yra skirtumų Map.get (objektas) ir Map.containsKey (Object) kad visada būtų naudojamas tinkamas. Taip pat įdomu pažymėti, kad „Map“ yra panašus containsValue (objektas) metodas taip pat.

Čia pateikiu visą „MapContainsGet“ klasės kodų sąrašą, kad galėčiau išsamiau:

„MapContainsGet.java“