2014-01-16 18 views
7
StringBuilder sb = "asd"; 

Javaでは、このステートメントは明らかに間違っています。 EclipseのようなIDEがあることを教えてくれます:なぜStringを使用してStringBuilderオブジェクトを初期化できないのですか?

は、文字列からのStringBuilder

を変換することはできませんしかし、Stringオブジェクトは=オペレータによって初期化することができます。

メモリ割り当てに関連するいくつかの理由を知りたいと思います。

+4

'StringBuilder sb = new StringBuilder(" asd ");' – sp00m

答えて

10

StringBuilderはオブジェクトであり、構築する必要があるためです。文字列がでないため、で、StringBuilderであるため、エラーが発生しています。

文字列は特殊で、プリミティブとクラスの間になるように設計されています。コンストラクタを呼び出してStringインスタンスを作成する代わりに、文字列リテラルをString変数に直接割り当てることができます。

interesting topic:ジャワの

設計者は、言語のパフォーマンスを向上させるよう、代わりにすべてのオブジェクトを作る、 オブジェクト指向言語ではプリミティブ型を保持するので、 を決めました。プリミティブはコールスタック内に として格納されます。これは記憶スペースが少なく、操作するには安価な です。一方、オブジェクトはプログラム ヒープに格納されます。複雑なメモリ管理とより多くの記憶領域が必要です。

パフォーマンスの理由から、JavaのStringは、 プリミティブとクラスの間にあるように設計されています。

より読み出し:

+0

ありがとう!これは、 'String'が* Java *で特別なので、' = '演算子を使ってStringオブジェクトを構築することができるからです。 Javaで 'String'の詳細を紹介するURLリンクまたはブックリファレンスを教えてください。 –

+0

@chainroあなたは大歓迎です:)あなたに役立つかもしれないリンクを投稿しました。 – Maroun

+2

-1 Stringは、不変であり、オーバーロードされた "="演算子をサポートするという違いを持つオブジェクトです。もはやそれ以下ではありません。 – spectre

10

"xxx"言語*の仕様によってa String literalとして定義され、 Stringオブジェクトです。だから、書くことができます。

String s = "abc";  //ok we got it 
Object o = "abc";  //a String is an Object 
CharSequence cs = "abc"; //a String is also a CharSequence 

が、文字列JLSからのStringBuilder ...

*引用ではありません。

1

StringBuilderされる「文字列リテラルは、常にタイプStringのですが」ラッパーではないオブジェクトあなたは、変数の参照に割り当てられている文字列リテラルへの参照を持っているので、

1

これは

String sb = "asd"; 

に動作します。すなわち、種類は同じである。

これを行うことはできません。暗黙的にタイプを変換したり、Javaで割り当てられたオブジェクトを変更することはできません。

Object o = "asd"; 

Stringがオブジェクトであるために動作します。

0

文字列はクラスだけでなく、""内のものはJVM文字列であり、Stringオブジェクトはその文字列を参照します。
したがってString str="hello"が機能します。

しかし、StringBuilderと他の何千ものオブジェクトは、Stringほど特別ではないので、同様に初期化されません。

0

Javaで文字列uは

String s = "xyz"; 

または

String s = new String("XYZ"); 

しかしStringBuildeのような文字列のためのオブジェクトを定義することができ、クラス特殊なタイプです** rは同じようです**通常のクラスと、それに対してオブジェクトを作成する必要があるときは、新しいキーワード(オブジェクトを作成する)を使用する必要があります。 HTH

関連する問題