2013-07-29 14 views

Odpowiedz

0

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   
} 
+0

" abc "przejdzie do puli stringów, nie? –

+0

@ d'alar'cop Tak. –

0

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

7

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.

JLS 3.10.5:

Ł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. Java String is Special
  2. what is String pool in java?
  3. Strings, Literally.
+0

+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. –

+0

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? –

0

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).

0

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)); 
0

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

0

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.

Powiązane problemy