Kas atsitinka, kai atsarginis raktas yra įtrauktas į „HashMap“?

Jei kelis kartus HashMap tą patį raktą į „ HashMap metodą, kas nutinka pradinei vertei? O kas, jei netgi vertė kartojama? Aš neradau jokių dokumentų šiuo klausimu.

1 atvejis: perrašytos pagrindinės vertės

 Map mymap = new HashMap(); mymap.put("1","one"); mymap.put("1","not one"); mymap.put("1","surely not one"); System.out.println(mymap.get("1")); 

Mes surely not one .

2 atvejis: pasikartojanti vertė

 Map mymap = new HashMap(); mymap.put("1","one"); mymap.put("1","not one"); mymap.put("1","surely not one"); // The following line was added: mymap.put("1","one"); System.out.println(mymap.get("1")); 

Mes gauname one .

Bet kas atsitinka su kitomis vertybėmis? Aš mokiau pagrindus studentui, ir jie manęs paklausė. Ar Map yra kibiras, kuriam nurodyta paskutinė vertė (bet atmintyje)?

242
03 нояб. nustatė boodieye 03 nov. 2009-11-03 23:17 '09, 23:17, 2009-11-03 23:17
@ 12 atsakymų

Pagal apibrėžimą put komanda pakeičia ankstesnę reikšmę, susijusią su tam tikru žemėlapio raktu (konceptualiai, kaip masyvo indeksavimo operaciją primityviems tipams).

Žemėlapis paprasčiausiai sumažina vertės nuorodą. Jei niekas kitas neturi nuorodos į objektą, šis objektas tinka šiukšlių surinkimui. Be to, „Java“ grąžina bet kokią ankstesnę vertę, susijusią su šiuo klavišu (arba null jei trūksta), todėl galite nustatyti, kas tai buvo, ir, jei reikia, remti nuorodą.

Daugiau informacijos čia: HashMap Doc

278
03 нояб. atsakymas duotas jeddings 03 lapkričio. 2009-11-03 23:21 '09, 23:21 2009-11-03 23:21

Atsakymą galite rasti javadoc žemėlapyje # put (K, V) (kuris iš tikrųjų grąžina kažką):

 public V put(K key, V value) 

Nurodytą vertę susieja su nurodytu šios kortelės raktu (pasirinktinai). Jei žemėlapyje anksčiau buvo pateiktas šio rakto žemėlapis, senoji vertė pakeičiama nurodyta verte. (Rodomas žemėlapis m yra raktų k žemėlapis, jei ir tik tada, kai m.containsKey(k) yra true .)

Parametrai:
key - raktas, su kuriuo turi būti susieta nurodyta vertė.
value yra reikšmė, susijusi su nurodytu raktu.

Grįžti:
Ankstesnė reikšmė, susieta su nurodytu raktu, arba null jei nebuvo užfiksuotas key . ( null grįžimas taip pat gali rodyti, kad anksčiau susietas žemėlapis yra null su nurodytu key , jei įgyvendinimas palaiko null reikšmes.)

Todėl, jei nenurodysite grąžinimo vertės, kai skambinate „ mymap.put("1", "a string") , jis paprasčiausiai nustoja taikyti nuorodą ir todėl turi teisę rinkti šiukšles.

70
03 нояб. atsakymą pateikė Pascal Thivent 03.11 . 2009-11-03 23:22 '09, 11:22 AM 2009-11-03 23:22

Ankstesnė rakto vertė pašalinama ir pakeičiama nauja.

Jei norite išsaugoti visas raktų pateiktas vertes, galite pagalvoti, kaip įgyvendinti kažką panašaus:

 import org.apache.commons.collections.MultiHashMap; import java.util.Set; import java.util.Map; import java.util.Iterator; import java.util.List; public class MultiMapExample { public static void main(String[] args) { MultiHashMap mp=new MultiHashMap(); mp.put("a", 10); mp.put("a", 11); mp.put("a", 12); mp.put("b", 13); mp.put("c", 14); mp.put("e", 15); List list = null; Set set = mp.entrySet(); Iterator i = set.iterator(); while(i.hasNext()) { Map.Entry me = (Map.Entry)i.next(); list=(List)mp.get(me.getKey()); for(int j=0;j<list.size();j++) { System.out.println(me.getKey()+": value :"+list.get(j)); } } } } 
18
22 марта '12 в 15:45 2012-03-22 15:45 atsakymas duotas kamlesh0606 kovo 22 d. 12 val. 15:45 2012-03-22 15:45

tai yra raktų / verčių funkcija, ir jūs negalite turėti dvigubo rakto kelioms reikšmėms, nes kai norite gauti faktinę vertę, kurią viena iš vertybių priklauso jūsų pavyzdyje įvestam raktui, kai norite gauti vertę "1", kurią ?!
Šios priežastys turi unikalų raktą kiekvienai vertei, bet jūs galite gauti iš „Java“ standarto „lib“:

 import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class DuplicateMap<K, V> { private Map<K, ArrayList<V>> m = new HashMap<>(); public void put(K k, V v) { if (m.containsKey(k)) { m.get(k).add(v); } else { ArrayList<V> arr = new ArrayList<>(); arr.add(v); m.put(k, arr); } } public ArrayList<V> get(K k) { return m.get(k); } public V get(K k, int index) { return m.get(k).size()-1 < index ? null : m.get(k).get(index); } } 

ir galite jį naudoti taip:

  public static void main(String[] args) { DuplicateMap<String,String> dm=new DuplicateMap<>(); dm.put("1", "one"); dm.put("1", "not one"); dm.put("1", "surely not one"); System.out.println(dm.get("1")); System.out.println(dm.get("1",1)); System.out.println(dm.get("1", 5)); } 

ir spausdinimo rezultatas:

 [one, not one, surely not one] not one null 
17
10 февр. atsakymą pateikė java acm 10 vasaris. 2016-02-10 00:03 '16 at 0:03 2016-02-10 00:03

Nurodytą vertę susieja su nurodytu šios kortelės raktu. Jei žemėlapyje anksčiau buvo užfiksuotas raktas, pakeiskite senąją vertę.

11
12 июля '17 в 19:18 2017-07-12 19:18 Atsakymą pateikė Diego Alejandro liepos 17 d. 17:18:18 2017-07-12 19:18

Į jūsų klausimą, ar kortelė atrodė kaip kibiras: ne.

Atrodo, kad yra sąrašas su name=value poromis, o name neturi būti eilutė (galbūt).

Jei norite gauti elementą, jūs perduodate raktą į metodą „get“ (), kuris grąžina jums priskirtą objektą.

Ir „ Hash“ žemėlapis reiškia, kad jei bandysite atkurti objektą naudodamiesi gavimo metodu, jis nepalygins tikrojo objekto su pateiktuoju, nes jam reikės kartoti per savo sąrašą ir palyginti () raktą, kurį pateikėte su dabartiniu elementas.

Tai būtų neveiksminga. Vietoj to, nesvarbu, koks yra jūsų objektas, jis apskaičiuoja vadinamąjį maišos kodą iš abiejų objektų ir juos lygina. Lengviau palyginti dvi int o ne du visiškai (galbūt giliai sudėtingus) objektus. Jūs galite galvoti apie maišos kodą kaip santrauką su iš anksto nustatytu ilgiu (int), todėl jis nėra unikalus ir turi susidūrimų. Rasti kodo taisykles rasite dokumentuose, į kuriuos aš įtraukiau nuorodą.

Jei norite daugiau sužinoti apie tai, galite pažvelgti į straipsnius apie javapractices.com ir technofundo.com

svarsto

4
03 нояб. Atsakymas pateikiamas Atmocreations 03 lapkričio. 2009-11-03 23:44 '09, 23:44 PM 2009-11-03 23:44

Aš visada naudoju:

 HashMap<String, ArrayList<String>> hashy = new HashMap<String, ArrayList<String>>(); 

jei noriu vienu identifikavimo raktu kelis dalykus taikyti.

 public void MultiHash(){ HashMap<String, ArrayList<String>> hashy = new HashMap<String, ArrayList<String>>(); String key = "Your key"; ArrayList<String> yourarraylist = hashy.get(key); for(String valuessaved2key : yourarraylist){ System.out.println(valuessaved2key); } } 

visada galite tai padaryti ir sukurti sau labirintą!

 public void LOOK_AT_ALL_THESE_HASHMAPS(){ HashMap<String, HashMap<String, HashMap<String, HashMap<String, String>>>> theultimatehashmap = new HashMap <String, HashMap<String, HashMap<String, HashMap<String, String>>>>(); String ballsdeep_into_the_hashmap = theultimatehashmap.get("firststring").get("secondstring").get("thirdstring").get("forthstring"); } 
3
03 февр. atsakymą pateikė sheepiiHD 03 vasaris. 2015-02-03 05:41 '15, 5:41 val. 2015-02-03 05:41

BTW, jei jums reikia semantikos, pavyzdžiui, tik tuo atveju, jei šis raktas neegzistuoja. Jūs galite naudoti concurrentHashMap su putIfAbsent() funkcija. Išbandykite:

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html#put(K,% 20V)

concurrentHashMap yra apsaugotas nuo sriegio su dideliu našumu, nes blokavimo mechanizmas naudojamas našumui pagerinti.

1
17 июня '15 в 21:19 2015-06-17 21:19 Atsakymą BufBills pateikia birželio 17 d., 15 val. 21:19 2015-06-17 21:19

Taip, tai reiškia, kad visas 1 raktas su verte perrašomas su paskutine pridėtine verte, ir čia pridedate „tikrai ne vieną“, todėl jis bus rodomas tik „tikrai ne vienas“.

Net jei bandote rodyti naudojant kilpą, jis taip pat parodys tik vieną raktą ir vertę, turinčią tą patį raktą.

1
24 авг. atsakymas duotas ajaynakrani 24 rug . 2016-08-24 13:52 '16, 13:52 pm 2016-08-24 13:52

Jis pakeičia esamą reikšmę atitinkamam klavišui žemėlapyje. Ir jei nėra tokio pavadinimo rakto, jis sukuria nustatytą reikšmę. pavyzdžiui:

 Map mymap = new HashMap(); mymap.put("1","one"); mymap.put("1","two"); 

EXIT mygtukas = "1", reikšmė = "du"

Taigi, ankstesnė vertė perrašoma.

0
01 февр. Atsakymas duotas Bishal Jaiswal 01 vasario mėn. 2019-02-01 09:51 '19 at 9:51 am 2019-02-01 09:51

JDK kortelės nėra skirtos duomenims saugoti pagal pasikartojančius raktus.

  • Geriausia, nauja vertė bus viršesnė už ankstesnę.

  • Blogiausias scenarijus yra išimtis (pavyzdžiui, kai bandote rinkti ją kaip srautą):

Nėra dublikatų:

Stream.of("one").collect(Collectors.toMap(x → x, x → x))

Geras Gausite: $ 2 ==> {one = one}

Dublikatas srautas:

Stream.of("one", "not one", "surely not one").collect(Collectors.toMap(x → 1, x → x))

Išimtis java.>

Jei norite dirbti su dviem egzemplioriais, naudokite kitą paketą, pavyzdžiui: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Multimap.html.

Yra daug kitų diegimų, susijusių su dvigubais raktais. Jie reikalingi internetui (pvz., Dubliuoti slapukų raktai, „Http“ antraštės gali turėti tuos pačius laukus, ...)

Sėkmės! :)

0
01 февр. Atsakymą pateikė Witold Kaczurba 01 vasaris. 2019-02-01 09:38 '19 , 9:38 am 2019-02-01 09:38
  HashMap<Emp, Emp> empHashMap = new HashMap<Emp, Emp>(); empHashMap.put(new Emp(1), new Emp(1)); empHashMap.put(new Emp(1), new Emp(1)); empHashMap.put(new Emp(1), new Emp()); empHashMap.put(new Emp(1), new Emp()); System.out.println(empHashMap.size()); } } class Emp{ public Emp(){ } public Emp(int id){ this.id = id; } public int id; @Override public boolean equals(Object obj) { return this.id == ((Emp)obj).id; } @Override public int hashCode() { return id; } } OUTPUT : is 1 

Taigi maišos žemėlapis neleidžia kopijuoti, jei teisingai apibrėžėte lygius ir hashCode ().

„HashSet“ taip pat naudoja „HashMap“ viduje, žr.

 public class HashSet{ public HashSet() { map = new HashMap<>(); } } 
-1
03 марта '15 в 3:39 2015-03-03 03:39 atsakymą SatyaS pateikė kovo 03 d. 15 val. 03:39 2015-03-03 03:39

Kiti klausimai apie „ arba „ Klauskite“