2012-01-04 24 views
3

これで検索しましたが、関連するビットを絞り込むにはキーワードがあまりにも一般的でなければなりません。なぜ、アンドロイドで文字列を宣言する方法が両方とも有効で、違いがありますか?文字列foo = "bar"と文字列foo = Androidの新しい文字列( "bar")?

+1

それらは同じです。私はこれをチェックアウトすることをお勧めします:http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.htmlあなたは基本的にStringオブジェクトの新しいインスタンスをインスタンス化しています。 – Robert

+1

文字列は不変なので、違いはないと思います。違いがあるかどうかを調べるために、それぞれが生成したバイトコードを調べることができます。 – Mitch

+0

おそらく[String対新しいString()]のコピーとして閉じられるべきです(http://stackoverflow.com/questions/3052442/what-is-the-difference-between-text-and-new-stringtext-in-java ) – Sulthan

答えて

4

newキーワードを使用すると、foo = "bar"を使用する新しい文字列オブジェクトが作成され、アプリ内の別の場所で使用される同じ文字列オブジェクトを指すようになります。 instacneについて

String foo = "bar"; 
String foo2 = "bar"; 

コンパイラは[foo.equals(foo2)にconradictionに、foo == foo2]まったく同じオブジェクトであると、上記のコードを最適化します。

EDIT:いくつかの検索の後、@スルタンが正しいです。これは、依存元の問題をコンパイラではありません、それはspecsである:

文字列リテラルは常にクラス 文字列の同じインスタンス(§4.3.1)を指します。

+0

これはコンパイラによって決定されていません。この動作は厳密に定義されています。 – Sulthan

+0

@講演:あなたはその声明を参考にしてもいいですか?私はスペックでそれを見落としましたが、もしそれが提供できれば私の答えを喜んで修正します。 – amit

+0

'String.intern()'のドキュメント。 'すべてのリテラル文字列と文字列定数定数式は中止されています ' – Sulthan

0

これはAndroidに関するだけでなく、Javaに関するものです。

"xxxx"と書くと、リテラル文字列になります。これはStringインスタンスです。同じ値を持つすべてのリテラル文字列は同じインスタンスであることに注意してください。詳細は、方法String.intern()を参照してください。

例:この例では


String s1 = "abc"; 
String s2 = "abc"; 

s1 == s2は真です。

new String("xxx")はコピーコンストラクタです。 1つの文字列(リテラル)を取り、そこから新しいインスタンスを作成します。すべての文字列は不変なので、通常これはやりたくないものです。

例:


String s1 = "abc"; 
String s2 = new String("abc"); 

s1.equals(s2)
s1 == s2真では偽

0
String x = new String("x") 

が効果的に2つの文字列を作成しています。 1つはリテラル(変数名のない式)で、もう1つはxとして保持します。それは同じです:

String x; 
{ 
    String a = "x"; 
    x = new String(a); 
} 
関連する問題