2017-01-18 5 views
3

a == bはすべてJava完全互換の実装では常にtrueですか?文字列プールの最適化はJavaによって定義されていますか?

String a = "abc"; 
String b = "abc"; 

if (a == b) 
    System.out.println("True"); 

Trueがジョブインタビューで印刷されるかどうか尋ねられました。私はabが同じ​​を指すことができることを知っていましたが、この最適化が標準化されているのか、それとも特定の実装の動作であるのか分かりませんでした。

+1

あなたの例では、はいです。 [文字列リテラル](http://stackoverflow.com/questions/3297867/difference-between-string-object-and-string-literal)を使用すると、[String interning](https:// en .wikipedia.org/wiki/String_interning)。簡単に起こりうる文字列オブジェクトを作成するとうまくいきません。そのため、このインタビューでは、このケースでは動作しますが、安全ではありません。なぜなら、コードをコピーして、仕事。 – Aziuth

+1

インタビューでは、あなたが削除したというあなたのコメントを見ました。それについては、それで、あなたはjavaに関するあらゆる詳細を知らないのですか?そして、あなたは危険な推測の代わりに保存ソリューションに行く傾向がありますか?合理的に聞こえる。学習する能力は、いくつかの詳細よりもはるかに重要です。より良い答えは、「私はそうは思わないが、私はそれについてはわからない」のようなものを言うだろうが。面接官が賢い人であれば少なくとも。間違いが起こり、あなたが間違いに対する免除を受けていないことを認識することが重要です。結論として、それをあまりにも難しくしないでください。 – Aziuth

答えて

3

はい。 Java Language Specification #3.10.5によって保証されている:

また、文字列リテラルは常にクラスStringの同じインスタンスを指します。これは、定数式(15.28)の値である文字列リテラルまたはより一般的な文字列が、String.internというメソッドを使用して一意のインスタンスを共有するように「インターナショナル」になっているためです。

3

文字列リテラルのインターンは、Java言語仕様、JLS section 3.10.5で指定あります。

参照:また、文字列リテラルは、常にクラスStringの同じインスタンスを参照します。これは、定数式(15.28)の値である文字列リテラルまたはより一般的な文字列が、String.internメソッドを使用して一意のインスタンスを共有するために「中止」されているためです。

はい、あなたの就職インタビューの正解は「はい」ですが、確かにフォローアップして、ストリング等価性は常に.equals()でテストする必要があります。

関連する問題