2016-07-12 2 views
1

はのは、次のように私はクラスがあるとしましょう:次のコードは、真なりJavaの - 自動のStringコンストラクタ内インターン

class Apple { 

    String apple; 

    Apple(String apple) { 
     this.apple = apple; 
    } 
} 

何?

public boolean result() { 
    Apple a = new Apple("apple"); 
    Apple b = new Apple("apple"); 

    return a.apple == b.apple; 
} 

Javaは自動的にオブジェクトのインスタンス内で設定された文字列を使用しますか?

new String("...")を使用してJavaを作成したのは、Javaが文字列を使用できない唯一の時間ですか?

EDIT:回答を

おかげで、この質問への拡張は、同じテストで

Apple a = new Apple(new String("apple")); 
Apple b = new Apple(new String("apple")); 

戻りを言うことであろう。

これは、文字列リテラルではなく、Stringのインスタンスをコンストラクターに渡すためです。

答えて

2

Javaは自動的にオブジェクトのインスタンス内で設定された文字列を使用しますか?

ポイントは次のとおりです。あなたがApple a最初に作成するときに、JVMは"apple"を含むStringのインスタンスを提供します。 にはStringが追加されています。

例:

Apple a = new Apple("apple"); 
Apple b = new Apple(new String("apple")); 

System.out.println(a.apple == b.apple); 

OUTPUT:

ですから、再利用される二Apple bStringを作成するとき、あなたは同じオブジェクトa.apple内の基準とb.appleを持っています

false 

彼らは(「...」)新しいStringを使用して作成しているときに、Javaがインターン文字列のない唯一の時間がありますか?

文字列オブジェクトを==と比較すると、内容ではなくオブジェクト参照が比較されます。

String::equals()又はString::intern()

​​

に関する質問String使用の内容を比較するために、

+0

ああ、わかりました。そして、たとえ私がAppleを使っていても新しいApple(新しいString( "apple")); Apple b =新しいApple(新しいString( "apple"));結果は依然として偽である。 –

+0

@wild_nothingはい、p'は私の更新を確認してください、私はそれが明確になることを望みますが、あなたがさらに明確化が必要かどうか尋ねることを躊躇しないでください –

1

フィールドappleAppleは、の参照からStringです。

あなたのケースでは、中止される文字列リテラルを使用してAppleをインスタンス化しているため、参照が中身の文字列を参照しています。

abは同じ内部文字列から作成されているため、はb.appleと同じ文字列を参照しています。

実際には、new Stringを使用するとJavaでは文字列を使用できません。

関連する問題