• 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

42 Warsaw Coding Academy
0 głosów
653 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 (353,220 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 (353,220 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 (353,220 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,360 p.)

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

komentarz 18 maja 2022 przez Wiciorny Ekspert (280,610 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,610 p.)

Jeśli zwrócisz obiekt z funkcji nie będzie to ta sama referencja, więc troszke  śmiesznie mówiąc "nasrałeś sobie w koszyczek" ( mówie prześmiewczo, nie żeby Cię urazić). 
 
Lokalne zmienne jeśli nie należą do klasy jako pola ( wtedy juz nie sa to lokalne zmienne), są tworzone na stosie i istnieją tak długo jak na call-stack stosie wywoływana jest aktualna metoda, następnie są usuwane. Więc obiekt zwrócony nie będzie tą samą referencją, jaką miał obiekt wewnętrzny>
To są zmienne szybkiego dostępu.
A czepiam się  błędnego stwierdzenia : 

 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>‚

bo to bzdura i wyklucza to działanie samego JAVA MEMORY MODEL, ale wiem co miałeś na myśli :)  

1
komentarz 19 maja 2022 przez Czarus0 Obywatel (1,040 p.)
Cześć! Dzięki za sprostowanie. Zastosowałem skrót myślowy. :)

Referencja faktycznie będzie inna, ale będziemy operować na tym samym obiekcie obecnym w pamięci.

Pozdrawiam!
komentarz 19 maja 2022 przez Wiciorny Ekspert (280,610 p.)
no totalna bzdura bo nie będziemy... obiekt lokalny już nie będzie istniał w pamięci, będzie to nowy obiekt. To jest stos, a nie sterta, wiec zmienna która oczekuje na wynik jest referencja pustą a wartość zwrócona, będzie nowa w zakresie tej referencji - tzn. referencja istnieje w pamięci ale tak długo  jak nie zwrócimy wartości to referencja jest pusta.
Ergo java za ciebie zoptymalizuje działanie i utworzy ją w procesie runtime jeśli zajdzie taka potrzeba a nie w momencie kompilacji, chyba że zmienna uwcześnie jest polem klasy, albo jest to metoda statyczna wtedy też zmienna i tak musi być statyczna bo ładowane elementy statyczne są zanim wywołany jest konstruktor samej klasy

Uważniej dobieraj słowa, bo to bardzo istotne w kwestii samej javy.
komentarz 19 maja 2022 przez Czarus0 Obywatel (1,040 p.)
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) {
        HashMap<Integer, String> mapa = utworzmape();
        System.out.println(mapa.get(1));
    }
}

To mówisz, że `mapa` z `utworzmape` i `mapa` w `main` to nie będzie ten sam obiekt w pamięci?

komentarz 19 maja 2022 przez Wiciorny Ekspert (280,610 p.)

 Mówiłem Ci o różnicy między obiektami a statycznymi wartościami.
Static: powodujuje że lokalna mapa - jest w pamięci zanim konstruktor SAMEJ KLASY zostanie wywołany. 

  public static

 I tak, to nie będzie TEN SAM OBIEKT w pamięci javy. 

 HashMap<Integer, String> mapa // referencja mapa -> mapa jako zmienna wskazuje na pewien obiekt w pamięci

lokalnie tutaj 

  HashMap<Integer, String> mapa = new HashMap<Integer, String>();

to nie jest ten sam obiekt, bo ta zmienna jest na stosie a nie na stercie.
Sprawdź sobie CALL STACK podczas kompilacji. 

Niestety mylisz bardzo refrencje z samym obiektem oraz z wartością samego obiektu. 
Bo zmienna wskazująca na pewien obiekt jest refrencją do tego miejsca nie do tego co do niej przychodzi 

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

No oki, a to nie oznacza, że te zmienne wskazują na ten sam obszar w pamięci na stercie? Pytam, bo po prostu może czegoś nie do końca rozumiem i dzięki Tobie może faktycznie coś mi się wyjaśni. :)

BTW. Tam w obydwu przypadkach jest @696, bo coś rozdzielczość siada na tym forum. :)

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

93,379 zapytań

142,380 odpowiedzi

322,533 komentarzy

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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...