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?
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?
Nie będzie co najmniej cztery obiekty:
"xyz"
"xyz"
ciąg"abc"
'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) –
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();
Ale jest poparcie 'char []' współużytkowane między 'StringBuilder' i' String'. To jest nonsensowne pytanie. –
@ TomHawtin-tackline. 1) Myślę, że to zależy od wersji Java, prawda? 2) Tak, to jest ... rodzaj. –
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 !!)
To nie jest literówka "xyz", ale "abc" – FazoM
@fazomisiek - Nie rozumiem, co mówisz. (Myślę, że źle odczytałeś to, co napisałem ...) –
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.
Poinformuj nas, w jaki sposób wywnioskowałeś, że będą dwa obiekty. –
3 i głosuję za blisko. – partlov
Trzy. Ciągi są niezmienne, więc ponowne przypisanie tworzy inny ciąg. – Makoto