2013-04-01 8 views
5
String x = new String("xyz"); 
String y = "abc"; 
x = x + y; 

Ile obiektów String zostanie utworzonych w tym kodzie?Ile obiektów String zostanie tutaj utworzonych?

+4

Poinformuj nas, w jaki sposób wywnioskowałeś, że będą dwa obiekty. –

+0

3 i głosuję za blisko. – partlov

+0

Trzy. Ciągi są niezmienne, więc ponowne przypisanie tworzy inny ciąg. – Makoto

Odpowiedz

12

Nie będzie co najmniej cztery obiekty:

  • internowanych strunowe "xyz"
  • kopia internowany "xyz" ciąg
  • internowanych strun "abc"
  • Wynik złączenie dwa ciągi.
+0

'x + y' oceni na" xyzabc ". Ten obiekt zostanie zapisany w" Puli String ". A następnie 'new String (" xyzabc ");' zostanie wywołany, co spowoduje powstanie obiektu napisowego na stercie, którego odniesienie zostanie zwrócone do 'x'. Jest 5 obiektów. Moja odpowiedź opiera się na "publicznym kodzie konstruktora (String original)" [z tego źródła] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/ java/lang/String.java # String.% 3Cinit% 3E% 28java.lang.String% 29) –

7
String x = new String("xyz"); 

Jest jeden: "xyz" to internowany ciąg znaków.
Istnieją dwa: new String("xyz").

String y = "abc"; 

Istnieją trzy: "abc" to internowany ciąg znaków.

x = x + y; 

Jest cztery. Ponieważ łańcuchy są niezmienne, musi zostać utworzony trzeci obiekt: new String("xyzabc").

Możliwe, że może istnieć piąty obiekt, ponieważ kompilator może użyć StringBuilder do wykonania łączenia ciągów.

StringBuilder s = new StringBuilder(x); 
s.append(y); 
x = s.toString(); 
+0

Ale jest poparcie 'char []' współużytkowane między 'StringBuilder' i' String'. To jest nonsensowne pytanie. –

+0

@ TomHawtin-tackline. 1) Myślę, że to zależy od wersji Java, prawda? 2) Tak, to jest ... rodzaj. –

6

Po załadowaniu klasy tworzone są dwa obiekty typu String (najprawdopodobniej), po jednym dla każdego ciągu literowego String. Jest to jednorazowa sprawa ...

każdym razem kod jest uruchamiany, tworzone są dwa ciągi:

  • new String("xyz") tworzy nowy ciąg, którego stan jest taki sam, jak "xyz" dosłownym.

  • Łączy konkatenacja x + y tworzy drugi nowy ciąg.

Należy zauważyć, że String y = "abc"; NIE tworzy nowego ciągu. Zamiast tego przypisuje odwołanie do istniejącego ciągu znaków do y. W rzeczywistości jest to odniesienie do obiektu String dla literału, który został utworzony podczas ładowania klasy.


Właściwie, jeśli drążyć, nie zamierza być char[] array stworzony dla każdej z utworzonych obiektów String. Ponadto konkatenacja ciągów znaków może wymagać utworzenia tymczasowego obiektu. Oba są szczegółami implementacji.

Jest również możliwe, że załadowanie klasy może spowodować, że nie zostanie utworzone z utworzeniem nowych obiektów typu String o.Prawdą jest, że literały String będą reprezentowane przez obiekty ciągów w puli łańcuchów, jednak dokładny proces, w jaki to się dzieje, jest szczegółem implementacji ... i nie musi koniecznie być związany z wywoływaniem na świeżo utworzonym obiekcie String. .


Jeszcze jedna odpowiedź polega na tym, że obiekty ZERO są tworzone. To jest po prostu kod źródłowy Java, a kod źródłowy Java nie tworzy obiektów, chyba że je skompilujesz i uruchomisz. (Tada !!)

+0

To nie jest literówka "xyz", ale "abc" – FazoM

+1

@fazomisiek - Nie rozumiem, co mówisz. (Myślę, że źle odczytałeś to, co napisałem ...) –

1

x: jak używasz nowego słowa kluczowego i konstruktor klasy String obiektu String jest tworzony

„ABC”: jest ciągiem dosłowny i Java tworzy obiekt String gdy napotka ciąg literału.

x: Łączenie dwóch ciągów jest przekształcane na StringBuilder.append (X) .append (Y) .toString(), aby utworzyć tutaj inny obiekt.

Powiązane problemy