Programmēšana

Java Map.get un Map.contains Key

Izmantojot Java kartes ieviešanu, dažreiz parasti tiek izsaukta Kartemetode (Object) un reaģēt atšķirīgi, pamatojoties uz to, vai atgrieztā vērtība ir nulle vai nē. Varētu pieņemt vispārēju pieņēmumu, ka nulles vērtība, kas atgriezta no Map.get (Object), norāda, ka kartē nav ieraksta ar norādīto atslēgu, taču tas ne vienmēr notiek. Patiešām, ja Java Karte ieviešana pieļauj nulles vērtības, tad ir iespējams Karte lai atgrieztu tās vērtību dotajai atslēgai, taču šī vērtība var būt nulle. Bieži vien tas nav svarīgi, bet, ja tas tā ir, var izmantot Map.containsKey (), lai noteiktu, vai Karte ierakstam ir atslēgas ieraksts. Ja tā notiek un Karte atgriežas nulle saņemot šo pašu atslēgu, visticamāk, ka atslēga tiek saistīta ar a nulle vērtība. Citiem vārdiem sakot, ka Karte var atgriezties ar “true” saturKey (objekts) tajā pašā laikā atgriežoties " nulle" priekš iegūt (objekts). Tur ir daži Karte ieviešana, kas neļauj nulle vērtības. Tādos gadījumos a nulle no "get" zvana konsekventi jāatbilst "false" atgriešanai no metodes "saturKey".

Šajā emuāra ziņā es parādīju šos Map.get (objekts) un Map.containsKey (Object). Pirms došanās uz šo demonstrāciju es vispirms norādīšu, ka Map.get (Object) Javadoc dokumentācija skaidri brīdina par smalkām atšķirībām starp Map.get (objekts) un Map.containsKey (Object):

Ja šī karte pieļauj nulles vērtības, tad atgriešanās vērtība ir nulle ne vienmēr norāda, ka kartē nav atslēgas kartēšanas; ir arī iespējams, ka kartē ir skaidri norādīta atslēga nulle. The saturKey operāciju var izmantot, lai nošķirtu šos divus gadījumus.

Ziņas piemēriem es izmantoju valstis, kas definētas tālāk:

Valstis.java

iepakojums dustin.piemēri; / ** * Enum, kas pārstāv atsevišķus rietumu štatus Amerikas Savienotajās Valstīs. * / valsts enum valstis {ARIZONA ("Arizona"), KALIFORNIJA ("California"), COLORADO ("Colorado"), IDAHO ("Idaho"), KANSAS ("Kansas"), MONTANA ("Montana"), NEVADA ( "Nevada"), NEW_MEXICO ("Ņūmeksika"), NORTH_DAKOTA ("Ziemeļdakota"), OREGON ("Oregon"), SOUTH_DAKOTA ("Dienviddakota"), UTAH ("Jūta"), VAŠINGTONA ("Vašingtona"), WYOMING ("Vaiominga"); / ** Valsts nosaukums. * / privāta virkne stateName; / ** * Parametrēts enum konstruktors, kas pieņem valsts nosaukumu. * * @param newStateName Valsts nosaukums. * / Valstis (galīgā virkne newStateName) {this.stateName = newStateName; } / ** * Norādiet štata nosaukumu. * * @return Valsts nosaukums * / public String getStateName () {return this.stateName; }} 

Nākamajā kodu sarakstā tiek izmantots iepriekšminētais uzskaitījums un aizpildīta valstu karte ar to galvaspilsētām. Metode pieņem klasi, kurai jābūt konkrētai ģenerējamas un aizpildāmas kartes ieviešanai.

generatorStatesMap (klase)

/ ** * Ģenerējiet un aizpildiet valstu karti uz galvaspilsētām ar norādīto kartes veidu. * Šī metode reģistrē arī visas kartes ieviešanas, kurām nulles vērtības * nav atļautas. * * @param mapClass Ģenerējamā kartes tips. * @return Štatu karte uz galvaspilsētām. * / privāta statiska karte generatorStatesMap (klases mapClass) {Kartes mapToPopulate = null; if (Map.class.isAssignableFrom (mapClass)) {mēģiniet {mapToPopulate = mapClass! = EnumMap.class? (Karte) mapClass.newInstance (): getEnumMap (); mapToPopulate.put (Valstis.ARIZONA, "Fēnikss"); mapToPopulate.put (Valstis.KALIFORNIJA, "Sakramento"); mapToPopulate.put (Valstis.KOLORADO, "Denvera"); mapToPopulate.put (States.IDAHO, "Boise"); mapToPopulate.put (Valstis.NEVADA, "Kārsonsitija"); mapToPopulate.put (Valstis.NEW_MEXICO, "Sante Fe"); mapToPopulate.put (Valstis.NORTH_DAKOTA, "Bismark"); mapToPopulate.put (Valstis.OREGON, "Salem"); mapToPopulate.put (Valstis.SOUTH_DAKOTA, "Pjērs"); mapToPopulate.put (States.UTAH, "Soltleiksitija"); mapToPopulate.put (Valstis.VASHINGTONA, "Olympia"); mapToPopulate.put (States.WYOMING, "Cheyenne"); mēģiniet {mapToPopulate.put (States.MONTANA, null); } catch (NullPointerException npe) {LOGGER.severe (mapToPopulate.getClass (). getCanonicalName () + "neatļauj nulles vērtības -" + npe.toString ()); }} catch (InstantiationException instantiationException) {LOGGER.log (Level.SEVERE, "Nevarēja instantizēt tipa karti" + mapClass.getName () + instantiationException.toString (), instantiationException); } catch (IllegalAccessExceptionegalAccessException) {LOGGER.log (Level.SEVERE, "Nevar piekļūt tipa kartei" + mapClass.getName () + nelegālsAccessException.toString (), nelegālsAccessException); }} else {LOGGER.warning ("Nodrošinātais datu tips" + mapClass.getName () + "nav karte."); } atgriešanās mapToPopulate; } 

Iepriekš minēto metodi var izmantot, lai izveidotu dažāda veida kartes. Es šobrīd nerādu kodu, bet mans piemērs izveido šīs Maps ar četrām īpašām ieviešanām: HashMap, LinkedHashMap, ConcurrentHashMap un EnumMap. Katra no šīm četrām realizācijām pēc tam tiek palaista caur metodi demonstrētGetAndContains (karte), kas tiek parādīts nākamais.

demonstrētGetAndContains (karte)

/ ** * Parādiet Map.get (Valstis) un Map.containsKey (Valstis). * * @param karte Karte, kurā jāveic demonstrācija. * / private static void demonstrētGetAndContains (galīgā kartes karte) {final StringBuilder demoResults = new StringBuilder (); galīgā virknes mapType = map.getClass (). getCanonicalName (); galīgās valstis montana = Valstis.MONTANA; demoResults.append (NEW_LINE); demoResults.append ("Tipa karte" + mapType + "atgriež" + (map.get (montana)) + "mapei Map.get (), izmantojot" + montana.getStateName ()); demoResults.append (NEW_LINE); demoResults.append ("Tipa karte" + mapType + "atgriež" + (map.containsKey (montana)) + "mapei Map.containsKey (), izmantojot" + montana.getStateName ()); demoResults.append (NEW_LINE); gala valstis Kansas = Valstis.KANSAS; demoResults.append ("Tipa karte" + mapType + "atgriež" + (map.get (kansas)) + "mapei Map.get (), izmantojot" + kansas.getStateName ()); demoResults.append (NEW_LINE); demoResults.append ("Tipa karte" + mapType + "atgriež" + (map.containsKey (kansas)) + "mapei Map.containsKey (), izmantojot" + kansas.getStateName ()); demoResults.append (NEW_LINE); LOGGER.info (demoResults.toString ()); } 

Šajā demonstrācijā es ar nolūku izveidoju Maps, lai Montānai būtu nulles kapitāla vērtības, lai Kanzasā vispār nebūtu ierakstu. Tas palīdz parādīt atšķirības Map.get (objekts) un Map.containsKey (Object). Tā kā ne visi kartes ieviešanas veidi nepieļauj nulles vērtības, es ieskauj daļu, kurā Montana bez lielo burtu ievietota try / catch blokā.

Pēc tam parādās četru veidu Maps palaišanas rezultāti, izmantojot kodu.

17. augusts 2010 23:23:26 dustin.examples.MapContainsGet logMapInfo INFO: HashMap: {MONTANA = null, WASHINGTON = Olympia, ARIZONA = Phoenix, CALIFORNIA = Sacramento, WYOMING = Cheyenne, SOUTH_DAKAD_EXOR = Pjēra, COLOR = Sante Fe, NORTH_DAKOTA = Bismark, NEVADA = Carson City, OREGON = Salem, UTAH = Soltleiksitija, IDAHO = Boise} 2010. gada 17. augusts 11:23:26 dustin.examples.MapContainsGet demonstrGetAndContains INFO: java tipa karte. util.HashMap atgriež vērtību Map.get (), izmantojot java.util tipa Montānas karti. HashMap atgriež vērtību true Map.containsKey (), izmantojot Montana Map tipa java.util.HashMap atgriež Map.get () vērtību, izmantojot Kanzasas karti java.util.HashMap atgriež vērtību Mapes IDAHO = Boisa, NEVADA = Kārsonas pilsēta, NEW_MEXICO = Sante Fe, NORTH_DAKOTA = Bismark, OREGON = Salem, SOUTH_DAKOTA = Pierre, UTAH = Soltleiksitija, WASHINGTON = Olympia, WYOMING = Cheyenne, MONTANA = null} 2010. gada 17. augusts 11:23:26 dustin.examples.MapContainsGet demonstrGetAndContains INFO: Java.util.LinkedHashMap tipa karte atgriež Map.get () vērtību null, izmantojot Montānas java tipa karti .util.LinkedHashMap atgriež vērtību true mapē Map.containsKey (), izmantojot Montana Map tipa java.util.LinkedHashMap atgriež vērtību Map.get (), izmantojot Kansas kartes veidu java.util.LinkedHashMap atgriež mapei Map.containsKey () izmantojot Kansas 2010. gada 17. aug. 23:23:26 dustin.examples.MapContainsGet generētStatesMap SEVERE: java.util.concurrent.ConcurrentHashMap neatļauj nulles vērtības - java.lang.NullPointerException 2010. gada 17. augustā 23:23:26 dustin.examples .MapContainsGet logMapInfo INFO: ConcurrentHashMap: {SOUTH_DAKOTA = Pierre, ARIZONA = Phoenix, WYOMING = Cheyenne, UTAH = Soltleiksitija, OREGON = Salem, CALIFORNIA = Sacramento, IDAHO = Boise, NEW_MEXICO , WASHINGTON = Olympia, NEVADA = Carson City} 2010. gada 17. augusts 23:23:26 dustin.examples.Ma pContainsGet demonstrGetAndContains INFO: java.util.concurrent tipa karte. ConcurrentHashMap atgriež Map.get () vērtību null, izmantojot Montana java.util.concurrent.ConcurrentHashMap karti, izmantojot Mapana java.util tipa kartes Montana. .concurrent.ConcurrentHashMap atgriež vērtību Map.get (), izmantojot Kanzasas kartes veidu java.util.concurrent.ConcurrentHashMap atgriež mapei Map.containsKey () nepatiesu vērtību, izmantojot Kanzasas 2010. gada 17. augusta 11:23:26. dustin.examples.MapContainsGet logMapInfo INFO: EnumMap: {ARIZONA = Fēnikss, CALIFORNIA = Sakramento, COLORADO = Denvera, IDAHO = Boise, MONTANA = null, NEVADA = Carson City, NEW_MEXICO = Sante Fe, NORTH_DAKOTA = Bismark, OREGON = Salem, SOUTH_DAK Lake City, WASHINGTON = Olympia, WYOMING = Cheyenne} 2010. gada 17. augusta 11:23:26 dustin.examples.MapContainsGet demonstrGetAndContains INFO: Java.util.EnumMap tipa karte atgriež Map.get () veida vērtību, izmantojot Montānas kartes veidu java.util.EnumMap atgriež mapi Map.containsKey (), izmantojot Montana Map of ty pe java.util.EnumMap atgriež vērtību Map.get (), izmantojot Kanzasas karti. Java.util tipa karte. EnumMap atgriež mapi Map.containsKey (), izmantojot Kanzasu. 

Trim kartes tipiem, kuriem es varēju ievadīt nulles vērtības, izsaukums Map.get (Object) atgriež nulli pat tad, ja metode vērtība. Kansas gadījumā rezultāti ir konsekventi Map.get () atgriež nulli, bet Map.containsKey () atgriež vērtību “false”, jo Maps for Kansas nav neviena ieraksta.

Iepriekš minētais rezultāts arī parāda, ka es nevarēju likt Montānas kapitālam nulles vērtību VienlaicīgaHashMap ieviešana (tika izmests NullPointerException).

17. augusts 2010 23:23:26 dustin.examples.MapContainsGet generētStatesMapSEVERE: java.util.concurrent.ConcurrentHashMap neatļauj nulles vērtības - java.lang.NullPointerException

Tam bija blakusparādību saglabāšana Map.get (objekts) un Map.containsKey (Object) konsekventākas attiecīgās nulles un nepatiesās atgriešanās vērtības. Citiem vārdiem sakot, nebija iespējams, lai atslēga būtu kartē, ja tai nebūtu atbilstošas ​​vērtības, kas nav nulle.

Daudzos gadījumos Map.get (objekts) darbojas pēc nepieciešamības konkrētajām vajadzībām, taču vislabāk ir atcerēties, ka starp tām pastāv atšķirības Map.get (objekts) un Map.containsKey (Object) lai vienmēr tiktu izmantots atbilstošais. Interesanti ir arī tas, ka Map ir līdzīgs saturValue (objekts) metodi.

Šeit es norādīju visu MapContainsGet klases kodu sarakstu, lai iegūtu pilnīgumu:

MapContainsGet.java

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