• 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

Aruba Cloud - Virtual Private Server VPS
0 głosów
601 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 Mentor (352,580 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 Mentor (352,580 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 Mentor (352,580 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,340 p.)

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

komentarz 18 maja 2022 przez Wiciorny Ekspert (280,450 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 (280,450 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 (280,450 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 (280,450 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ź 318 wizyt
pytanie zadane 23 kwietnia 2022 w Java przez Czang Kai Shrek Obywatel (1,990 p.)
+1 głos
1 odpowiedź 204 wizyt
pytanie zadane 29 stycznia 2022 w Java przez Bakkit Dyskutant (7,600 p.)
0 głosów
1 odpowiedź 449 wizyt
pytanie zadane 27 kwietnia 2020 w Java przez danielo665 Obywatel (1,040 p.)

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,662 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...