Gdy plik .java jest kompilowany do pliku .class, wszelkie literały łańcuchowe są oznaczone w sposób szczególny, podobnie jak wszystkie są stałe. Gdy klasa jest ładowana w trybie (należy pamiętać, że ładowanie następuje przed inicjalizacją), JVM przechodzi przez kod klasy i szuka literałów String. Po znalezieniu sprawdza, czy równoważny ciąg znaków jest już oznaczony jako , do którego odwołuje się sterty. Jeśli nie, tworzy instancję String na sterty i zapisuje odniesienie do tego obiektu w stałej tabeli. Po dokonaniu odniesienia do tego obiektu String, wszelkie odniesienia do tego literału ciągu znaków w całym programie są po prostu zastąpione odniesieniem do obiektu przywoływanego z Literalnej puli napisów.
W powyższym przykładzie w Bazie literowej napisów znajdowałby się tylko jeden wpis, który oznaczałby obiekt String, który zawierałby słowo "someString". Obie zmienne lokalne, jedna i , zostaną przypisane do odwołania do tego pojedynczego obiektu String. Ty widać, że jest to prawdą, patrząc na dane wyjściowe powyższego programu . Podczas gdy metoda equals() sprawdza, czy obiekty String zawierają te same dane ("someString"), operator ==, gdy jest używany na obiektach , sprawdza równość referencyjną - co oznacza, że zwróci true, jeśli i tylko wtedy, gdy dwie zmienne referencyjne odnoszą się do dokładnie tego samego obiektu. W takim przypadku odniesienia są równe. Z powyższego wyjścia można zobaczyć, że zmienne lokalne, jeden i dwa, a nie odnoszą się tylko do ciągów znaków, które zawierają te same dane, odnoszą się do tego samego obiektu, co obiekt .
Nie zrozumiesz lepiej puli ciągów, patrząc na rzeczywisty kod. Zasadniczo jest to rodzaj mapy hash.W szczególności JVM zna tę specjalną mapę, aby nadal obsługiwać usuwanie śmieci dla zawartych ciągów. Jeśli rozumiesz te zasady, nie musisz patrzeć na kod. Z drugiej strony, jeśli nie rozumiesz, kod nie pomoże ci. – Holger
@Holger OK. Wiem o działaniu hashmapu. szukałem dla mnie jeszcze więcej "nieczytanych" rzeczy, patrząc na rzeczywistą implementację. –