StringとString.valueOfへのキャストの違い


88

違いは何ですか

Object foo = "something";
String bar = String.valueOf(foo);

そして

Object foo = "something";
String bar = (String) foo;

17
ええと、それらは同じではありません...まったく。
知覚

回答:


148

文字列へのキャスト、オブジェクトが実際に文字列である場合にのみ機能します。

Object reallyAString = "foo";
String str = (String) reallyAString; // works.

オブジェクトが他のものである場合は機能しません。

Object notAString = new Integer(42);
String str = (String) notAString; // will throw a ClassCastException

String.valueOf()ただし、渡したものはすべてに変換しようとしますString。プリミティブ(42)とオブジェクト(new Integer(42)、そのオブジェクトを使用)の両方を処理しますtoString()

String str;
str = String.valueOf(new Integer(42)); // str will hold "42"
str = String.valueOf("foo"); // str will hold "foo"
Object nullValue = null;
str = String.valueOf(nullValue); // str will hold "null"

特に最後の例に注意してください。に渡すnullString.valueOf()文字列が返されます"null"


13
@AdamStelmaszczyk:関連するものがあるとは思えません。キャストは少し速いかもしれませんが、他の違い(null処理、他のタイプを処理する機能)は、パフォーマンスのわずか違いよりもはるかに重要です。
ヨアヒムザウアー2013年

3
この質問をもう少し推し進めるために、呼び出しString.valueOf()との間に大きな違いはありobj.toString()ますか?(最初に頭に浮かぶのは、nullのobj.toString()場合objは例外が発生することです。)
Kevin

3
@Kevin:参照型(別名「オブジェクト」)の場合、唯一の違いはnull。で何が起こるかです。String.valueOf()JDKでのの実装を見ると、null以外の参照に対して行うのはを呼び出すことだけであることがわかりますtoString()
ヨアヒムザウアー

@JoachimSauer私はいつもString.valueOf()キャストよりもエレガントだと思っていました。しかしString.valueOf()、キャスティングが行うすべてのこと、そしてそれ以上のことを行うのであれば、キャストを使用することを選択する理由はありますか?なぜ非推奨にならなかったのですか?
Shahid M Zubair 2014年

1
@silver:確かに、私は単純化しすぎました。String.valueOf((Object) null)文字列「null」を返します。リテラルnullを使用して呼び出すと、String#valueOf(char [])が呼び出され、を渡すと実際にNPEがスローされnullます。
ヨアヒムザウアー2015

19

String.valueOf(foo)foo.toString()メソッドを呼び出し、結果をバーに割り当てます。これはnullであり、タイプセーフな操作です。

タイプが一致している場合、キャストはfooバーに割り当てるだけです。それ以外の場合、式はClassCastException。をスローします。


5
+1それがString.valueOf(Object)呼び出すことを説明するためにObject.toString()
Ryan Amos 2013年

4

の場合、どちらも同じ出力を生成しますString

Casting 提供されたオブジェクトがではない場合は失敗します string.


2

キャストとは、オブジェクトがString型である必要があることを意味しますが、String.valueOf()他の型も使用できます。


2

String.valueOfメソッドは、そのパラメータオブジェクトの文字列表現を取得するために使用されます。

(文字列)valueは、オブジェクト値を文字列にキャストします。

String.valueOfメソッドを使用すると、null参照を気にすることなく、オブジェクトの文字列表現を取得できます。null参照に文字列をキャストしようとすると、NullPointerExceptionが発生します。


1
final Object obj = null;
final String strValOfObj = String.valueOf(obj);
final String strCastOfObj = (String) obj;
if (strValOfObj == null) System.out.println("strValOfObj is null");
if (strCastOfObj == null) System.out.println("strCastOfObj is null");

出力strCastOfObj is null


0

最初のもの、すなわち、 String.valueOfは、オブジェクトが値型または文字列である表現可能な型である場合にのみ文字列を返します。それ以外の場合は、例外をスローします。

後者では、直接キャストしていますが、オブジェクトが文字列でない場合は失敗する可能性があります。

オンラインの例。

http://ideone.com/p7AGh5


どのような種類の例外ですか?
Yousha Aleayoub 2016

0

String.valueOf(); valueof()メソッドで渡されたすべての引数を型キャストする作業としての文字列は文字列に変換され、integer.string()と同様に整数を文字列のみに変換します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.