2015-12-05 18 views
5

Ponieważ w języku Java ciągi są implementowane jako odniesienia typu Object. Również ciąg constants jest zaimplementowany jako Obiekty.Alokacja pamięci do obiektów typu String?

Dla np:

System.out.println("This is a String"); 

W powyższym stwierdzeniem: „To jest łańcuch” realizowany jest także jako typ obiektu. Oznacza to zostanie ona przydzielona pamięć, która byłaby taka sama jak

String str = "This is a String"; 

Moje pytanie brzmi: Co zrobić, gdy wydrukować wiele ciągów za pomocą + operatora w tym samym System.out oświadczenie jak ta,

System.out.println("This is a String" + "This is another String"); 

Teraz, co ja Zasadniczo pytam, czy chcę wiedzieć, czy "This is a String" i "This is another String" zajmą różne obszary pamięci czy tę samą przestrzeń pamięci?

Czy dodawanie zmiennej między ciągami w instrukcji println() stanowi różnicę?

Dla np

int i = 10; 
System.out.println("This is a String" + i + "This is another String"); 

Inne kwestie związane z ciągów na tej stronie nie jest odpowiedź na moje pytanie specifically.Please umieścić światło na to pytanie^_^

Każda pomoc będzie mile widziane

Odpowiedz

6

Zasadniczo pytam, czy chcę się dowiedzieć, czy "This is a String" i "This is another String" zajmą różne obszary pamięci czy tę samą przestrzeń pamięci?

Tutaj zarówno String są stałe, więc w czasie kompilacji będą łączone i pojedynczyString"This is a StringThis is another String" będzie tworzyć w basenie String.

System.out.println ("To jest ciąg" + i + "To jest kolejny ciąg");

Rzeczywista moc String jest określana w czasie wykonywania, więc będzie tworzyć różne String S w obszarze sterty.

Z dokumentacji Java: String

język Java zapewnia specjalne wsparcie dla operatora konkatenacji (+), aw przypadku zamiany innych obiektów do strun. Łączenie ciągów jest realizowane za pośrednictwem klasy StringBuilder (lub StringBuffer) i jej metody dołączania. Konwersje łańcuchowe są realizowane za pomocą metody toString zdefiniowanej przez obiekt i dziedziczonej przez wszystkie klasy w języku Java.

2

Ponieważ w języku Java, Struny są implementowane jako odniesienia typu Object.Also, Stałe łańcuchowe są implementowane jako obiekty.

Nie, w ciągach Java są zaimplementowane jako obiekty tekstowe. Które są, oczywiście, obiektami. Wewnętrznie obiekty są manipulowane przez odniesienie. Stałe łańcuchowe są ponownie implementowane jako łańcuchy.

W odniesieniu do "This is a String" + "This is another String", nie jestem pewien, czy Java Language Specification mandaty że kompilatory musi obsłużyć to w specyficzny sposób, ale można bezpiecznie oczekiwać każdy połowie przyzwoity kompilator ocenić to w czasie kompilacji, co oznacza, że byłoby to najprawdopodobniej równoważne z "This is a StringThis is another String".

Dodanie zmiennej między stałymi łańcuchowymi oczywiście robi różnicę, ponieważ teraz nie można oszacować wyrażenia podczas kompilacji, więc dwa kompilatory muszą wygenerować dwa osobne obiekty ciągów, jeden dla "This is a String" i inny dla "This is another String". (O ile, oczywiście, i dzieje się na stałym poziomie, w którym to przypadku może nadal być oceniane w czasie kompilacji.)

Ale chciałbym sugerować, że wszystkie one są błahe szczegóły techniczne, o znikomym wpływie na wydajność, tak mimo że dobrze jest wiedzieć, jak działają, nie jest dobrze, aby ta wiedza zmusiła cię do zaprogramowania inaczej niż to, co byłoby najbardziej naturalne, abyś zakodował i zrozumiał swój kod.

+1

Jest to wymagane. – EJP

+0

@ EJP dziękuję. –

Powiązane problemy