2011-06-24 12 views
7

私の意見は今日まで、"c"のようなリテラルがStringというオブジェクトを作成するということでした。今日は、Javaが単一文字列のオブジェクトを作成していないと聞きました。これは正しいですか?そのリテラルをcharとして保存していますか?一文字の文字列

+3

聞きましたか?どこで聞いた? – bmargulies

+0

これは、1文字の文字列を 'char'に自動ボクシング/アンボックするという興味深いコンセプトになります... – Nick

+0

Java言語仕様のリテラルについての部分を読むように言った人に教えてください。文字リテラルと文字列リテラル:http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#100960 –

答えて

5

"c"は、Stringリテラルです。 Stringを表すStringを表します。は、Stringを表します。

リテラル(0文字のStringリテラル""でさえありません)の1文字の特殊文字の処理はありません。

違う扱いがあると言った人は、間違っているかb。別のもの(例えば特別な扱いをしている図書館)について話しています。

8

"c"は文字列を作成します。 'c'は文字を作成します

13

いいえ間違いありません。 ""でも、Stringオブジェクトが作成されます。 ただし、'c'と入力すると、Stringオブジェクトではなく、charが取得されます。

6

Javaは、単一の文字列に対しても文字列のインスタンスを作成します。次のプリントjava.lang.String

public class Test{ 
    public static void main(final String[] args){ 
     System.out.println("c".getClass().getName()); 
    } 
} 
+0

'' "(二重引用符)は文字列と ''''(一重引用符)が文字の場合 – Woot4Moo

1

"c"オブジェクトを作成しません。ただし、リテラルをソースコードのどこかに再度割り当てると、新しいオブジェクトは作成されませんが、作成された最初の文字列オブジェクトが参照されます。例えば

String s1 = "abc"; //creates the String object 
String s2 = "abc"; //references the same object as s1 

S1とS2の両方が同じオブジェクトが割り当てられ、そして==に働くだろう。

あなたがここで詳細を読むことができます:意図されたものをhttp://javatechniques.com/blog/string-equality-and-interning/たぶん

+0

間違っています。 ==は、String.internを使用した場合にのみ機能します。 – Woot4Moo

+0

@ Woot4Mooいいえ、そうです。リテラル文字列はデフォルトで使用できません。 – sfussenegger

+0

@ Woot4Moo https://gist.github.com/1044768 – sfussenegger

1

は、ボンネットの下にflyweightsが作成されるということであった(これは、Javaで動作します知らんどのように、私は、この概念は、文字列のためにいくつかのレベルでemployeedされていることを前提とし)

+0

これは、いくつかの操作、つまり、結果のStringがフードの下で同じchar []を使用する部分文字列(..)、subSequence(..)およびtrim()に当てはまります。私はこれがどのように文字列リテラルに影響するかはわかりません。 – sfussenegger

0

String店舗文字char[]として、最も可能性が高いので、"c"Stringオブジェクト内new char[] { 'c' }として表現されます。

Stringクラスはfinalであるため、char cフィールドには1文字の文字列を格納するサブクラスは存在しません。

Stringcharの自動ボクシング/アンボクシングの概念は文書化されていない限り、1文字の文字列が他のタイプと同様に格納されていると想定するのは安全です文字列の

0

プログラミングのほとんどのものと同様に、ソース - > java.lang.Stringを見てください。

すべての文字列はjava.lang.Stringのインスタンスです。特別な場合はありません。各java.lang.Stringにはchar []と、開始インデックスと終了インデックスを保持するいくつかの整数が含まれています。char []はStrignインスタンス間で共有されることに注意してください。たとえば、元のchar []が複製されていないかコピーされていないString.substring()が共有されていますが、開始/終了インデックスは更新されます。