3秒でわかる
Java で値を文字列に変換する静的メソッド。null を渡しても例外にならず文字列 null が返る点が、toString との実務上の差になります。
30秒図解
もう少し詳しく
どういうものか
String.valueOf は、Java の String クラスに定義された静的メソッドで、渡された値を文字列に変換して返します。int long double char boolean といった基本型と、Object を受け取るものが多重定義されており、どの型を渡しても呼び出す形は同じです。
Object 版の中身は「引数が null なら文字列 "null" を返し、そうでなければ toString() を呼ぶ」という実装です。この 1 行の違いが、実務で toString() との使い分けを決めます。
なぜ必要か
Java は型に厳しく、int をそのまま String の変数に代入できません。画面表示、ログ出力、CSV への書き出し、SQL のパラメータ組み立てなど、値を文字列にして外に出す場面は避けられず、その入口として使います。
さらに大きい理由が null 安全です。DB から取得した値やリクエストのパラメータは null になり得ます。obj.toString() は null に対して NullPointerException を投げますが、String.valueOf(obj) は例外を出さずに "null" を返します。値の有無が保証できない場所ではこちらが安全です。
具体例
int count = 42;
double price = 1980.5;
boolean isNew = true;
Object nothing = null;
String s1 = String.valueOf(count); // "42"
String s2 = String.valueOf(price); // "1980.5"
String s3 = String.valueOf(isNew); // "true"
String s4 = String.valueOf(nothing); // "null" (例外にならない)
// nothing.toString() は NullPointerException になる
// char <a href="/glossary/array" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">配列</a>を渡すと 1 文字ずつ連結される (Object 版とは結果が違う)
char[] chars = {'J', 'a', 'v', 'a'};
System.out.println(String.valueOf(chars)); // Java似た用語との違い
| 書き方 | null のとき | 備考 |
|---|---|---|
String.valueOf(x) | "null" が返る | 例外にならない |
x.toString() | NullPointerException | x がオブジェクトのときのみ |
Integer.toString(n) | 基本型なので該当なし | int 専用で最も直接的 |
"" + x | "null" が返る | 内部で StringBuilder が作られる |
つまずきやすいところ
char[] を渡したときだけ挙動が違う。String.valueOf(chars) は "Java" になりますが、同じ配列を Object として渡すと [C@1b6d3586 のような参照表現になりますnull が "null" という 4 文字の文字列になることを見落とす。画面に「null」と表示されたり、その文字列がそのまま DB に保存されたりします。空文字にしたい場合は Objects.toString(x, "") を使いますString.valueOf(10) と String.valueOf(9) を辞書順で比べると "10" のほうが小さくなります。大小の比較は数値のまま行いますtoString() を実装しないまま渡し、クラス名とハッシュ値が出力される。ログに使うクラスは toString() を上書きしておきます覚え方
null が来るかもしれない場所は String.valueOf、絶対に来ない場所は toString()。迷ったら前者にしておけば落ちません。