2016-02-19 12 views
7

Chcę głębiej zrozumieć pulę napisów. Proszę, pomóż mi dostać się do pliku klasy źródłowej zawierającego tę implementację w Javie.W jaki sposób Java implementuje łączenie ciągów?

Pytanie jest bardziej związane ze znalezieniem kodu źródłowego lub implementacją Puli Ciągów, aby pogłębić tę koncepcję, aby dowiedzieć się więcej o nieznanych lub nieuchwytnych rzeczach. W ten sposób możemy jeszcze bardziej efektywnie wykorzystać łańcuchy lub wymyślić inny sposób implementacji własnych kolekcji śmieci w przypadku, gdy mamy aplikację tworzącą tyle literałów i obiektów łańcuchowych.

+0

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

+0

@Holger OK. Wiem o działaniu hashmapu. szukałem dla mnie jeszcze więcej "nieczytanych" rzeczy, patrząc na rzeczywistą implementację. –

Odpowiedz

4

Można przejść przez ten artykuł: Strings, Literally

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 .

+0

Bardzo słaba jakość cytowania: liczne błędy, a implementacja uległa zmianie w czasie. Na przykład znaczna część pracy jest wykonywana przez kompilator, a nie JVM, a JVM sprawdza tabelę stałą w pliku .class, a nie w kodzie bajtowym. – EJP

14

przykrością muszę cię rozczarować, ale Java String-Pool nie jest rzeczywista klasa Java, ale gdzieś realizowane w JVM to znaczy jest napisane jako kodu C++. Jeśli spojrzysz na source code of the String class (prawie całkowicie w dół), zobaczysz, że metoda intern() jest natywna. Będziesz musiał przejść przez jakiś kod JVM, aby uzyskać więcej informacji.

Edytuj: Niektóre implementacje można znaleźć tutaj (C++ header, C++ implementation). Wyszukaj StringTable.

Edycja2: Jak zauważył Holger w komentarzach, nie jest to trudny wymóg wdrożenia JVM. W związku z tym możliwe jest posiadanie wirtualnej maszyny wirtualnej, która inaczej implementuje pula łańcuchów, np. przy użyciu rzeczywistej klasy Java. Chociaż wszystkie powszechnie używane maszyny JVM zdaję sobie sprawę z wdrożenia go w kodzie JVM C++.

+0

Dzięki za informacje. Tak, w kodzie źródłowym metoda jest natywna. Czy możesz podać link, z którego mogę pobrać macierzysty kod źródłowy. –

+0

Nie byłem pewien, czy jest napisane w C lub C++ ^^ Ale tak naprawdę jest to C++, więc naprawię to. – MartinS

+1

@ Ankit_ceo2 powinieneś być w stanie pobrać go tutaj http://download.java.net/openjdk/jdk7/ – MartinS

Powiązane problemy