2016-06-12 12 views
3

Stringクラスはどのように機能しますか?私は多くの記事を読んできましたが、答えは見つかりませんでした。StringクラスはJavaでどのように内部的に動作しますか?

String str="ABC"; 

上記の文はコンストラクタを呼び出しますか?

public String(char[] paramArrayOfChar) 

そうならば、それはどのようにそれを呼び出すのですか?代入演算子を使用しています。どのようにStringクラスのコンストラクタを呼び出すのですか?

+1

あなたが探している答えは、ここで見つけることができますhttp://stackoverflow.com/questions/7088928/java-strings-how-do-they-work – Twahanz

+0

おそらく以前に勉強した人のための混乱の原因Cおよび/またはC++では、リテラル "ABC"はchar配列ではありません。これは既にStringであり、それが現れるメソッドが呼び出される前にStringオブジェクトとして独自に存在します。したがって、コンストラクタを呼び出す必要はありません。ステートメント 'String str =" ABC "'は単に* reference *を代入します。 –

+0

@KlitosKyriacou、私が思うに、文字列リテラル**はC言語のconst char [] '配列です。 – Andrew

答えて

-1

文字列リテラルのセクションでは、Java Language Specificationは文字列の作成方法を指定していません。それは、彼らがString.intern()を使用して保留されていることだけを指定します。

したがって、実装で文字列を作成する方法については保証されません。

+0

String.intern()は文字列を作成しません。 –

1

これはもう少し複雑です。文字列はJavaのグローバルストアに格納されるため、コンストラクタは一度呼び出され、JVMはどの文字列を "intern"(グローバルストアに格納)するかを決定し、 "ABC"をもう一度宣言すると同じインスタンスになる可能性があります。

1

上記のステートメントはコンストラクタを呼び出しますか?

いいえ、そうではありません。文字列プールに"ABC"が含まれていない場合は、String str = new String("ABC")のように見えます。再度"ABC"と入力すると、内部ストレージの古いバージョンが使用されます。プールにすでにこの値が含まれている場合、作成されたオブジェクトはありません。ストレージからこの値を引き出すだけです(のようなリテラルを使用している場合は当てはまりますが、newキーワードを使用している場合は、 少しdifferent)です。

"ABC"はすでに内部でvalueを含むchar[] {'A','B','C'}というオブジェクトが定義されています。 I は、"ABC"のインスタンスのどこかがnew String(new char[]{'A','B','C'})として作成されていると仮定しても構いません(仕様には何も記載されていません)。

+0

String Poolに "ABC"が含まれていない場合、String constructor.if yesを呼び出すと、コンストラクタの呼び出し方法を理解したいと思います。 – alakhya

+0

@alakhyaコンストラクタは呼び出されず、 '' ABC ''の値はStringプールから返されます – Andrew

1

編集我々はこのString str1 = "Hello World";ようにそれを使用したいときに我々が(そのは、多くのプログラミングlanuageでそれを使用する方法によってString Interningを使用している:コンピュータサイエンスで

、文字列のインターンがメソッドでありますそれぞれの文字列値のコピーを1つだけ保存することができます。これは変更不可能でなければなりません。内部文字列 では、文字列処理タスクの処理時間が長くなります。 は、文字列が に作成または保留されている時間が長くなりますが、スペース効率が向上します。別個の値は、文字列インターン プールに格納されます。最初の文字列が存在しない場合はString constant poolをチェック

JVM、それは、新しいStringオブジェクトを作成、どのように?intern()方法がStringオブジェクトで呼び出された場合、文字列がが、その後、プールからの文字列が返されを発見された場合には、文字列プールで、このStringオブジェクトによってが含まれて見えます。それ以外の場合は、このStringオブジェクトがプールに追加され、このStringオブジェクトへの参照が返されます。

例:

// s1 == s2 is false 
String s1 = new String("sometext"); 
// s1 == s2 is true 
//String s1 = new String("sometext").intern(); 
String s2 = s1.intern(); 
String s3 = "sometext"; 
System.out.println(s2 == s3); 

別の例(abbas値を読んで、それを変更)

 String str = "abbas"; 
     Field value = str.getClass().getDeclaredField("value"); 
     value.setAccessible(true); 
     char[] Value = (char[]) value.get(str); 
     System.out.println("Value = " + Arrays.toString(Value)); 

     char[] newVal = new char[]{'f','t','b','h','p'}; 
     value.set(str,newVal); 
     Value = (char[]) value.get(str); 
     System.out.println("Value = " + Arrays.toString(Value)); 
     //Value = [a, b, b, a, s] 
     //Value = [f, t, b, h, p] 
1

文字列は、プログラミングの共通かつ重要な一部であるため、Javaにはいくつかの文字列のための特別な サポートを追加しました言語の構文内の操作。これらの操作 には、文字列リテラルからの新しいStringインスタンスの自動作成、+演算子を使用した 複数のStringオブジェクトの連結、およびその他のデータ型の 文字列表現への変換が含まれます。そこ明示的な方法は、これらの機能、 のすべてを実行することが可能ですが、Javaプログラマのための便利なようにそれらを自動的に行い、

文字列リテラル

以前の例では、明示的からStringインスタンスを作成する方法を示した明快追加しますnew演算子を使用して 文字の配列しかし、 文字列リテラルを使用してこれを行う簡単な方法があります。プログラム内の文字列リテラルごとに、Javaは自動的にString オブジェクトを作成します。したがって、文字列リテラルを使用してStringオブジェクトを初期化することができます。 Stringオブジェクトリテラルすべての文字列のために作成され

char chars[] = { 'a', 'b', 'c' }; 
String s1 = new String(chars); 
String s2 = "abc"; // use string literal 

ので、あなたはStringオブジェクトを使用することができます任意の 場所リテラル文字列を使用することができます。たとえば、次のよう のコードは、2つの等価な文字列を作成します。たとえば、次の文が示すように、オブジェクト参照のように、引用符で囲まれた文字列で直接メソッドを呼び出すことができます。これは、文字列 "abc"のlength() メソッドを呼び出します。予想どおり、 "3"が印刷されます。 System.out.println( "abc" .length());

関連する問題