• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

wywołanie metody HashMap w main

Object Storage Arubacloud
0 głosów
250 wizyt
pytanie zadane 17 maja 2022 w Java przez Arek Kowalski Początkujący (450 p.)

witam, zadałem sobie problem utworzenia w klasie jednej metody z kolekcją HashMap, w metodzie main chciałem wywołać wartość (value) przypisaną do klucza (key) i coś mi nie wychodzi. Jak to zrobić w main??

import java.util.HashMap;
import java.util.Map;


public class T170522_01 {

    public static HashMap<Integer, String> utworzmape(){
        HashMap<Integer, String> mapa = new HashMap<Integer, String>();
        mapa.put(1, "jeden");
        mapa.put(2,"dwa");
        mapa.put(3,"trzy");
        return mapa;
    }

    public static void main(String[] args){
       
        System.out.println(mapa.get(1)); // wiem, że to nie działa :(
    }

kombinowałem na różne sposoby ale zawsze wywala mi błąd 

 

2 odpowiedzi

+1 głos
odpowiedź 17 maja 2022 przez adrian17 Ekspert (344,860 p.)
No, bo w metodzie `main` nigdy nie stworzyłeś zmiennej `mapa`; nie wywołałeś metody `utworzmape`.
komentarz 17 maja 2022 przez Arek Kowalski Początkujący (450 p.)
import java.util.HashMap;
import java.util.Map;

import javafx.css.StyleableStringProperty;


public class T170522_01 {

    public static HashMap<Integer, String> utworzmape(){
        HashMap<Integer, String> mapa = new HashMap<Integer, String>();
        mapa.put(1, "jeden");
        mapa.put(2,"dwa");
        mapa.put(3,"trzy");
        return mapa;
    }

    public static void main(String[] args){
       
        utworzmape();
        System.out.println(mapa.get(1));
    }

 

komentarz 17 maja 2022 przez Arek Kowalski Początkujący (450 p.)
dalej lipa :(
komentarz 17 maja 2022 przez adrian17 Ekspert (344,860 p.)
Wywołałeś metodę która zwraca HashMapę. Ale wciąż nie masz w main()ie zmiennej o nazwie mapa.

Silnie sugeruję powtórzyć jakikolwiek tutorial o używaniu metod, zwracaniu wartości etc. Masz problem z podstawami, nie HashMapą.
komentarz 17 maja 2022 przez Arek Kowalski Początkujący (450 p.)

no geniusz, dzięki za radę Watsonie. Poradziłem sobie bez Twojego tytanowego wsparcia 

 

    import java.util.HashMap;

public class T170522_02 {

    public static HashMap<Integer, String> utworzmape(){
        HashMap<Integer, String> mapa = new HashMap<Integer, String>();
        mapa.put(1, "jeden");
        mapa.put(2,"dwa");
        mapa.put(3,"trzy");
        return mapa;
    }

    public static void main(String[] args){
       
        System.out.println(utworzmape().get(1));  
    }

}

 

1
komentarz 17 maja 2022 przez adrian17 Ekspert (344,860 p.)

no geniusz, dzięki za radę Watsonie. Poradziłem sobie bez Twojego tytanowego wsparcia 

...napisałem dokładnie co masz źle i na co spojrzeć żeby poprawić. To jest podręcznikowe wsparcie. Jak oczekiwałeś gotowego rozwiązania, to raczej nie rozumiesz jak rzeczy działają ;)

komentarz 18 maja 2022 przez Oscar Nałogowiec (29,290 p.)

@Arek Kowalski, Chyba jeden z najbardziej zaawansowanych sposób by napisać "jeden".

komentarz 18 maja 2022 przez Wiciorny Ekspert (269,590 p.)
ta metoda nawet sensu nie ma, bo jej działanie jest zawarte jedynie podczas wywołania :D
0 głosów
odpowiedź 19 maja 2022 przez Czarus0 Obywatel (1,040 p.)
Cześć! Zmienne stworzone w metodzie są tylko dostępne w ramach tej metody, tylko tam mają zasięg. Zmienna ‚mapa’ została uwierzono w ramach metody ‚utworzmape’, dlatego tam można z niej korzystać. Jeśli natomiast chcesz mieć do niej dostęp w ‚main’ (dokładniej do jej referencji) to musisz zwracany wynik z wywołania metody ‚utworzmape’ przypisać do zmiennej typu ‚Map<Integer, String>‚. Dopiero wtedy będziesz mógł skorzystać z ‚get’ w System.out.println. Pozdrawiam!
komentarz 19 maja 2022 przez Wiciorny Ekspert (269,590 p.)

To teraz proszę Cię: poczytaj czym jest HASH  a czym jest referencja, bo to dwie inne sprawy są 

collisions: unequal objects may have the same hashCode

a aktualnie jedynie co wypisujesz to hash obiektu. ( tzn logujesz w debugerze) 
https://en.wikipedia.org/wiki/Contraposition
HashCode i Eqals contract - poczytaj 

Użyj do tego JSHELLA a nie IDE,. które równie dobrze może Ci "inteligętnie to podpowiadać" na takich rzeczach nie bazuje się o IDE, które jest dla programisty, ono Ci nawet nie poda informacji o aktualnym GB- coletorze.
https://docs.oracle.com/javase/9/tools/jshell.htm

komentarz 19 maja 2022 przez Czarus0 Obywatel (1,040 p.)

Zgadzam się HASH i REFERENCJA to kompletnie dwa różne pojęcia :)

`hashCode` jest w ogóle inny. @696 mówi nam o miejscu w pamięci, a hashCode to wartość np. pomocna przy używaniu HashMapy ;) 

W stercie trzymasz wszystkie obiekty, a na stosie tylko zmienne deklarowane w danej metodzie. Dlatego nie możesz odwołać się do zmiennej zadeklarowanej w dalszej linijce, bo nie ma jej jeszcze na stosie :)

komentarz 19 maja 2022 przez Wiciorny Ekspert (269,590 p.)

przeczytaj raz jeszcze co napisałem o static i sprawdź co wywoła się pierwsze twoja metoda statyczna, czy konstruktor klasy. 
I zwróć uwagę na referencje w jshellu, które nie podpowiada inteligętnie IDE. 
Bo @number to nie jest referencja, chyba że tak sobie tłumaczysz tym, że korzystasz z IDE i oto to tak traktuje. 

prosto z dokumentacji 

Object reference variables.works just like primitive variables-if the reference is declared as a local variable, it goes on the stack.else if refrence is instance variable it will go into the heap within an object.

wypisz sobie referencje z innego wątku zanim zwrócisz "i przypiszesz wartość" map jest inna referencja :)  

hashcode() // zwraca Ci  wartość numeryczna w int :) 
Returns a hash code value for the object. This method is supported for the benefit of hash tables such as those provided by HashMap.

komentarz 19 maja 2022 przez Wiciorny Ekspert (269,590 p.)

@Czarus0, jakby było tak jak piszesz, z każdym razem miałbyś ten sam obiekt, a w trakcie niestety tak nie jest i referencje są inne :) to że Ci IDE tak pokazuje to ... jego sprawa- to ma wbudowany system CACHE i optymalizacji kodu w locie tym bardziej jak robisz "kompilacje zeby uruchomic ten program" 
 

   public static HashMap<Integer, String> utworzmape() {
        HashMap<Integer, String> mapa = new HashMap<Integer, String>();
        mapa.put(1, "jeden");
        mapa.put(2,"dwa");
        mapa.put(3,"trzy");
        out.println(System.identityHashCode(mapa)); // same hash
        return mapa;
    }

    public static void main(String[] args) {
        // zanim zwrocony zostanie wynik utworzMape
        // mapa -> jest inna referencja bo mozesz sprawdzic
        HashMap<Integer, String> mapa = utworzmape();
        System.out.println(mapa == utworzmape()); // teraz sprawdzasz referencje  false.
        out.println(System.identityHashCode(mapa)); // o dziwo hash jest ten sam 
    }

 

komentarz 19 maja 2022 przez Czarus0 Obywatel (1,040 p.)
Hmmm, ale za każdym wywołaniem `utworzmape` zwrócony zostanie inny obiekt, ponieważ w tej metodzie tworzymy obiekt HashMap<Integer, String>. To taka metoda fabrykująca zwracająca nam za każdym razem przygotowaną, ale INNĄ mapę pod kątem pamięci, z 3 elementami. Dlatego w `System.out.println(mapa == utworzmape());` zwrócony został false. :)

Ja nie mówię, że referencja jest ta sama. Zgadza się, że to typ prymitywny, który się nie przekazuje. Mówię tylko, że metoda `utworzmape` zwraca nam adres w pamięci, a `HashMap<Integer, String> mapa = utworzmape();` tutaj mapa będzie na niego wskazywać. Oczywiście będzie inną referencją, ale ze wskazaniem na ten sam adres w pamięci. :)

Podobne pytania

+1 głos
1 odpowiedź 243 wizyt
pytanie zadane 23 kwietnia 2022 w Java przez Czang Kai Shrek Obywatel (1,990 p.)
+1 głos
1 odpowiedź 158 wizyt
pytanie zadane 29 stycznia 2022 w Java przez Bakkit Dyskutant (7,600 p.)
0 głosów
1 odpowiedź 308 wizyt
pytanie zadane 27 kwietnia 2020 w Java przez danielo665 Obywatel (1,040 p.)

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...