HashMap - dlaczego taki wynik ?

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"

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));

    }
}

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

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.

0

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

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

0
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

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1