HashMap - dlaczego taki wynik ?

HashMap - dlaczego taki wynik ?
TI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Witam,
właśnie jestem po rozmowie rekrutacyjnej na której byłem bardzo mocno pytany o porównywanie obiektów, zawartość stringów itp
I teraz robię sobie testy i mam coś takiego jak poniżej. Czy jest ktoś wstanie wytłumaczyć mi dlaczego java System.out.println(map.get(s2)); wypisuje "cos"

Kopiuj
public class Main {

    public static void main(String[] args) {
        String s1 = "test";
        String s2 = "test";

        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));

        HashMap<String, String> map = new HashMap<>();
        map.put(s1,"cos");
        System.out.println(map.get(s2));

    }
}

V-2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 671
0

Taki sam string będzie miał taki sam hashcode, a jak sama nazwa każe się domyślać, HashMap opiera się na haszkodach właśnie

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
2

A co by miało wypisać? o_O Skoro stringi są sobie równe to przecież oczywiste jest że możesz wybierać klucze z mapy za pomocą dowolnego z nich. Jaki to by miało sens inaczej? Co więcej String w Javie jest immutable i ma internal cache, wiec nie dość że stringi będą equal to najpewniej == też zwróci true, bo w rzeczywistości masz jednego stringa i dwie referencje do niego.

P7
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 91
0

@timati:
obczaj jeszcze jaki będzie wynik porównania s1 == s2 jeśli utworzysz Stringi w ten sposób

Kopiuj
String  s1 = new String("test");
String  s2 = new String ("test");

poczytaj co to string pool , bo pewnie będziesz nie raz pytany o te rzeczy na rozmowach

OL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
0
Kopiuj
import java.util.HashMap;

public class mapy {
    public static void main(String[] args) {
	
	String s1 = new String("test");
    String s2 = new String("test");

    
    System.out.println(s1.hashCode());
    System.out.println(s2.hashCode());
    
    System.out.println(s1 == s2);
    System.out.println(s1.equals(s2));

    HashMap<String, String> map = new HashMap<>();
    map.put(s1,"cos");
    System.out.println(map.get(s2));
    }
}

Output
3556498
3556498
false
true
cos

Tutaj masz to wytlumaczone bardziej obrazowo, jak stosujesz

Kopiuj
String s1 = "test";
 String s2 = "test";
System.out.println(s1 == s2);

Output
true

Dlatego ze JVM jest na tyle sprytna i s2 wskazuje rowniez na to samo miejsce w pamieci gdzie znajduje sie s1.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.