2017-02-02 8 views
3

オブジェクト指向言語では、の新しいキーワードを使用します(javaのメモリ割り当ては動的に行われるため)。String s = "sometext"はどのように動作しますか?

Stringは、新しいキーワードなしでオブジェクトがどのように作成されるかクラスですが、

それは文字列プールを使用していても、私ははっきりとそれを理解することはできませんよ。 文字列があり、Javaでは

+13

いいえ、そうではありません。コンパイラは '文字列リテラル'を他のオブジェクトでは不可能な特殊な方法で扱います(オートボックスされたプリミティブを除く)。 – Kayaman

+0

これらのスレッドを実行することはできません:[文字列と文字列リテラルの違い](http://stackoverflow.com/questions/3297867/difference-between-string-object-and-string-literal)[ "text"と新しいString( "text")の違い?](http://stackoverflow.com/questions/3052442/what-is-the-difference-between-text-and-new-stringtext) –

+0

*本当に*このようなことをしたいのなら、Scala(別のJVM言語)に切り替えて、特定のコンテキストの文字列をクラスに自動的に変換する暗黙のクラスを作成できます。なぜこれが必要なのか、私は疑問に思います。 – Carcigenicate

答えて

0

を「我々が直接文字列のような変数を初期化することができ、ユーザ定義クラスを作成することが可能です」不変であり、オプションでプールされている( "interned")。

"sometext"は、静的プールに由来するちょうどStringのインスタンスです。

java.lang.Stringfinalクラスなので、ユーザー定義のStringを作成することはできません。これはまさに不変の理由によるものです(1つのインスタンスを指すことによって複製を共有できます)。

4

Stringオブジェクトを文字列リテラルで作成できるようにするメカニズムは、コンパイラとJVMに組み込まれています。ユーザー定義型のオブジェクトでは使用できません。

初めて

String s = "sometext"; 

を書くとき、コンパイラは二つのことを発する:

  • constant poolそれで"sometext"のエントリ、および
  • に参照するようsを設定する命令定数テーブルのエントリ。

あなたは同じクラスで

String t = "sometext"; 

を記述する場合、コンパイラではなく、新しいものを作成するよりも、"sometext"のための既存の定数を再利用します。

実行時に、JVMは定数テーブルの各エントリに対して新しいStringオブジェクトを作成し、プログラムにアクセスします。基本的に、JVMはプログラムのためにnewを呼び出し、すぐに使えるオブジェクトを手渡します。

オートボックスを使用してプリミティブラッパーのインスタンスを作成すると、同様のシステムが動作します。しかし、一般的なことは、コンパイラからのサポートが必要であり、ユーザー定義型では使用できないということです。

+0

*** *** ...同じクラスではないのですか?.. –

+1

@ΦXocę笑ПepeúpaツこれはJVMに依存します。 "同じクラス"は最低限必要ですが、[他のJVM](http://stackoverflow.com/q/16690815/335858)はより積極的に文字列を共有できます。 – dasblinkenlight

+0

これはかなりクールです!ありがとう!! –

関連する問題