Jest pytanie wywiad:Ile instancji należy utworzyć w String str1 = new String ("abc")?
Ile instancje będą tworzone w tym stwierdzeniem:
String str1 = new String ("abc")
A odpowiedź brzmi 2: str1
i "abc"
.
Czy to prawda?
Jest pytanie wywiad:Ile instancji należy utworzyć w String str1 = new String ("abc")?
Ile instancje będą tworzone w tym stwierdzeniem:
String str1 = new String ("abc")
A odpowiedź brzmi 2: str1
i "abc"
.
Czy to prawda?
Nie - tylko jedna instancja została utworzona w stercie. Dosłowne "abc" idzie do basenu. Skompiluj i wykonaj javap, a zobaczysz tylko jeden kod nowy w kodzie bajtowym.
Rozważmy wykładowa
public class InstanceTest {
public static void main(String... args){
String str1 =new String ("abc");
}
}
Jeśli kompilować i DO-
javap -c InstanceTest
Mamy GET-
public class InstanceTest {
public InstanceTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String...);
Code:
0: new #2 // class java/lang/String
3: dup
4: ldc #3 // String abc
6: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V
9: astore_1
10: return
}
" abc "przejdzie do puli stringów, nie? –
@ d'alar'cop Tak. –
str1 jest vari w stanie odniesienia, a nie obiektu i „abc” jest String dosłowny, nie Object
myślę, tylko jedna instancje tworzony jest na stercie
tylko zostanie utworzone jedno wystąpienie w czasie wykonywania. Po załadowaniu klasy literowy "abc"
zostanie internowany w puli String, , chociaż technicznie rzecz biorąc JVM tworzy instancję "abc"
i przechowuje ją w puli String. Wyrażenie new String("abc")
tworzy instancję obiektu String
.
Łańcuch znaków jest odniesienie do klasy przykład łańcuch znaków (§4.3.1, §4.3.3).
Co więcej, literał łańcuchowy zawsze odnosi się do tej samej instancji klasy String. Dzieje się tak, ponieważ literały łańcuchowe - lub, bardziej ogólnie, ciągi będące wartościami wyrażeń stałych (§ 15.28) - są "internowane", aby dzielić unikalne instancje, używając metody String.intern.
również czytać JLS 15.28
kompilacji stałe wyrażenia typu String są zawsze „internowany”, tak aby dzielić wyjątkowe przypadki, stosując metodę String.intern.
Zalecane lektury:
+1. Myślę, że termin "stażysta" myli ludzi. Jeśli "abc" zostało już utworzone i umieszczone w puli żądło, jvm nie musi tworzyć. Może po prostu odnosić się do już istniejącego. Jeśli nie istnieje, będzie musiał utworzyć jeden i umieścić go w puli. A następnie "nowe" słowo kluczowe również przyczynia się do zamieszania, gdy wyrażenie brzmi "kiedy tworzysz wystąpienie z" nowym "słowem kluczowym, tworzony jest nowy obiekt" ... co sprawia, że brzmi jak "abc" nie zostałoby stworzone, odkąd potężne "nowy" nie był używany. "abc" jest tam po prostu magicznie. –
String s1 = new String ("hello"); , ile referencji jest tworzonych na poziomie JVM? Znam dwa obiekty: 1 w czasie ładowania klasy dla "cześć" i 1 w czasie rzeczywistym wykonania polecenia. 1 referencją jest s1, mam wątpliwości, czy istnieje również druga referencja s2, która jest wynikiem łańcucha "hello" podczas ładowania klasy, który jest przekazywany do konstruktora "new String()". W java, nie ma możliwości, abyśmy mogli przekazać obiekt w funkcji lub konstruktorze, możemy tylko przekazać referencję. Powinien również znajdować się trzeci wzorzec s3, który powinien być wynikiem nowego ciągu ("cześć"), a następnie przypisany do s1? –
słowo kluczowe nowy utworzyć tylko jedną instancję, aw swoim przykładzie, można umieścić odniesienie do obiektu w str1 (uwaga: w przeciwnym razie byłoby usunięte przez garbage collector).
Utworzysz dwie instancje String. Używanie konstruktorów łańcuchów zamiast deklarowania ich jako literałów zawsze tworzy odrębne instancje.
Wystarczy spróbować następujący kod:
String str = "abc";
String str2 = "abc";
String newString = new String(str);
System.out.println("Are " + str + " and " + newString + " the same instance? " + (str == newString));
System.out.println("Are " + str + " and " + str2 + " the same instance? " + (str == str2));
Tylko jedno wystąpienie łańcucha zostanie utworzony, ponieważ kompilator Javy ma inteligencji, aby uniknąć niechcianych tworzenie String objects.It skompiluje plik do pliku w klasie który próbuje zoptymalizować kod tak bardzo, jak to możliwe.
Przeczytaj o internowanie łańcuchów tutaj http://en.wikipedia.org/wiki/String_interning
2 jest prawidłowa, gdy użycie „abc” basen const Java stworzyć „abc” przykład użyć nowego („ABC”), to utworzyć inną instancję ciąg w sterty.
Czuję, że odpowiedź brzmi 1, ponieważ "abc" zostaje internowana, a jedyną "instancją" jest tworzona jest 'str1' w sterty – sanbhat