2013-07-15 10 views

Odpowiedz

1

Ciąg Java zawiera niezmienną sekwencję znaków Unicode. W przeciwieństwie do C/C++, gdzie string jest po prostu tablicą znaków, String Java jest obiektem klasy java.lang. Java String jest jednak wyjątkowy. W przeciwieństwie do zwykłej klasy:

Łańcuch jest związany z literałem ciągu w postaci tekstów podwójnie cytowanych, takich jak "Cześć, świat!". Możesz przypisać literał ciągu bezpośrednio do zmiennej String, zamiast wywoływać konstruktora, aby utworzyć instancję String.

String s1 = "Hello";    // String literal 
String s2 = "Hello";    // String literal 
String s3 = s1;     // same reference 
String s4 = new String("Hello"); // String object 
String s5 = new String("Hello"); // String object 

How can a string be initialized using " "?

+0

Czy możesz nam powiedzieć, jak „Hello” zostanie internowany w basenie ciąg? Czy żaden konstruktor nie zostanie w ogóle wywołany? – NINCOMPOOP

+2

To jest raczej dyskusja o tym, jak zainicjować zmienne łańcuchowe, niż jak konwersja ciągu literowego na instancję napisową w środowisku wykonawczym, co, jak myślę, jest zamiarem tego pytania. – SpaceTrucker

11

Kiedy JVM ładuje klasę zawierający ciąg dosłownego

String str = "hello"; 

to odczytuje ciąg dosłowne z pliku klasy w kodowaniu UTF-8 i tworzy tablicę char z niego

char[] a = {'h', 'e', 'l', 'l', 'o'}; 

th PL tworzy przedmiot ciągiem z tej tablicy char pomocą ciąg (char []) konstruktor

new String(a) 

następnie JVM umieszczenie przedmiotu łańcuchowe w basenie łańcuchach i przypisuje się odniesienie do ten łańcuch do str zmiennej.

+0

+1 Świetnie, gdzie znalazłeś tę informację. Powinienem usunąć moją odpowiedź, ponieważ byłem w błędzie, że nie jest wywoływany żaden konstruktor. –

+0

Można by pomyśleć, że JVM może używać bardziej wydajnego prywatnego konstruktora, który nie musi wykonywać kopii tablicy. – Thilo

+0

+1 To jest poprawna odpowiedź. – NINCOMPOOP

3

Jak na JVM 5.1 spec

Aby czerpać ciąg dosłowne, Java Virtual Machine analizuje ciąg punktów kodowych podanych przez struktury CONSTANT_String_info.

  1. Jeżeli sposób String.intern wcześniej nazywany na przykład klasy łańcuch zawierający sekwencję unikodowe punktów kodowych identyczną z tą, której struktura CONSTANT_String_info, to wynikiem ciągach w wyprowadzenie jest odniesienie do to samo wystąpienie klasy String.

  2. W przeciwnym razie tworzone jest nowe wystąpienie klasy String zawierające sekwencję punktów kodu Unicode podaną w strukturze CONSTANT_String_info; odniesienie do tej instancji klasy jest wynikiem wywodzenia literału łańcuchowego. Ostatecznie wywoływana jest metoda intern nowej instancji String.

Dlatego z tego punktu możemy wywnioskować konstruktora może być:

String(int[] codePoints, int offset, int count)

Przydziela nowy ciąg, który zawiera znaki z subarray z kodem punkt tablicy argumentu Unicode . Argument przesunięcia jest indeksem pierwszego punktu kodowego subarray, a argument count określa długość podtablicy. Zawartość podprzestrzeni jest konwertowana na znaki; kolejna modyfikacja tablicy int nie ma wpływu na nowo utworzony ciąg znaków.

lub mogą być nawet prywatny konstruktor:

// Package private constructor which shares value array for speed. 
String(int offset, int count, char value[]) { 
this.value = value; 
this.offset = offset; 
this.count = count; 
} 
+0

Jak możemy wywnioskować, że ten konstruktor jest wywoływany? Jest publiczny i nieefektywny (musi wykonać kopię tablicy). Można by pomyśleć, że JVM może użyć bardziej wydajnego prywatnego konstruktora. – Thilo

+0

@Thilo Dobra obserwacja, ale nie widziałem żadnego 'prywatnego' konstruktora w 'String' i ten konstruktor jest bliżej tego, co mówi doktor. – NINCOMPOOP

+1

Jest jeden na linii 645 w http://hg.openjdk.java.net/jdk7/build-gate/jdk/file/tip/src/share/classes/java/lang/String.java – Thilo

Powiązane problemy