Integer.toString(int i)とString.valueOf(int i)


175

なぜメソッドString.valueOf(int i)が存在するのでしょうか?この方法を使用して変換していますintStringて発見しましたInteger.toString(int i)

これらのメソッドの実装を調べたところ、最初のメソッドが2番目のメソッドを呼び出していることがわかりました。結果として、私のすべての呼び出しにString.valueOf(int i)は、直接呼び出すよりも1つ多くの呼び出しが含まれます。Integer.toString(int i)


回答:


46

同じことを行うための2つの異なる方法。それは歴史的な理由かもしれません(一方が他方の前に来たかどうか思い出せません)。


22
はい、しかし何かが同じことをしている場合、それが同じことを意味するわけではありません。
ダミアンLeszczyński-ヴァシュ

3
String.valueOf(int)は、Integer.toString(i)を直接呼び出すだけです。Integer.toString(int)を呼び出すのが最善です。
djchapm

171

文字列型には、いくつかのメソッドvalueOfがあります。

static String   valueOf(boolean b) 
static String   valueOf(char c) 
static String   valueOf(char[] data) 
static String   valueOf(char[] data, int offset, int count) 
static String   valueOf(double d) 
static String   valueOf(float f) 
static String   valueOf(int i) 
static String   valueOf(long l) 
static String   valueOf(Object obj) 

ご覧のとおり、これらのメソッドはあらゆる種類の数値を解決できます

あなたが提示したような特定のメソッドのすべての実装:したがって、整数の場合

Integer.toString(int i)

ダブル用

Double.toString(double d)

等々

私の意見では、これは歴史的なものではありませんがvalueOf、適切な型からではなくStringクラスからメソッドを使用する方が、変更が少なくて済むため、より便利です。

サンプル1:

public String doStuff(int num) {

  // Do something with num...

  return String.valueOf(num);

 }

サンプル2:

public String doStuff(int num) {

 // Do something with num...

 return Integer.toString(num);

 }

サンプル2に見られるように、サンプル1とは異なり、2つの変更を行う必要があります。

私の結論では、valueOfStringクラスのメソッドを使用する方がより柔軟であり、それがそこで利用できる理由です。


18
そしてInteger.toString(int i, int radix)、それが10以外のベースの文字列に変換されることを忘れないでください
Stephen P

@Vash空の文字列を使用して、intをStringに変換してString.valueOfと比較する方法についても説明してください。例) "" + int i = "i"?どれが一番いいですか?
Kanagavelu Sugumar 2013

1
intを文字列としてフォーマットするには、 "" + iを使用しないでください。頭上には大きな存在はありませんが、これはエレガントではないためです。を使用する代わりにString.valueOf(int)、を使用String.format("%d",i);して詳細を読むことができます。このWebサイトにアクセスしてください。docs.oracle.com/ javase / 6 / docs / api / java / util / Formatter.html
-Vash

オートボクシングがより賢くなり、コンパイル時などに変換を追加したいだけです。
Rob Grant

1
@RobertGrantオートボクシングはここでは当てはまりません。しかし、あなたの懸念に答えるために、あなたがこれint i = new Integer("1");を行うことができ、その逆もできるので、それは賢いです。
DamianLeszczyński-Vash 2013年

52

大きな違いの1つtoString()は、nullオブジェクトを呼び出すとaが返されNullPointerException、使用String.valueOf()するとnullをチェックできない場合があることです。


46
問題はInteger.toString(int i)staticメソッドについてです。null可能なオブジェクトはありません。
PetrJaneček12年

14
Integer i = null; i.toString(); // Null pointer exception!! String.valueOf(i); // No exception
manish_s 2012年

10
@Manisクマール:あなたの例では発生しませんString.valueOf(int i)が、方法をString.valueOf(Object obj)。とにかく、問題はint、の可能性がないプリミティブな値についてですnull
hleinone

1
@manish_s例からわかるように、オブジェクト型Integerについて誰も話していません。私たちはプリミティブについて話しているだけです。
Daniel Ochoa 2016年

2
@manish_s:OPは言いませんでしInteger.toString()Integer.toString(int i)。これは静的メソッドです(docs.oracle.com/javase/7/docs/api/java/lang/…)。
LarsH

13

Stringクラスは、すべてのプリミティブ型とObject型にvalueOfメソッドを提供するため、これらはすべて1つのクラスからアクセスできる便利なメソッドであると思います。

NBプロファイリング結果

平均intToString = 5368ms、平均stringValueOf = 5689ms(100,000,000オペレーションの場合)

public class StringIntTest {


    public static long intToString () {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = Integer.toString(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static long stringValueOf () {

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = String.valueOf(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static void main(String[] args) {
        long intToStringElapsed = 0;
        long stringValueOfElapsed = 0;
        for (int i = 0; i < 10; i++) {
            intToStringElapsed += intToString();
            stringValueOfElapsed+= stringValueOf();
        }
        System.out.println("Average intToString = "+ (intToStringElapsed /10));
        System.out.println("Average stringValueOf = " +(stringValueOfElapsed / 10));
    }
}

7
プロファイリングには本当に「ウォームアップ」期間が必要です。そうしないと、JITが物事をいじくり回して結果が歪む可能性があります。とはいえ、10 ^ 8の演算での300msの差は非常に小さく、完全に無視できます。
Cameron Skinner、2010

1
@金剛私はあなたのテストケースが正しいとは思わない。値を割り当てるString jが使用しないため。基礎となるコンパイラがこれを最適化している可能性があります。別のメソッドでjオブジェクトを渡し、いくつかのダミー操作を行うことをお勧めします。
Rakesh 2013年

1
この方法で独自に作成したマイクロベンチマークを記述しないでください。JMHを使用する場合。ウォームアップ、時間測定、複数回の独立試行(Javaをフォークした!)を処理し、コードを小さくします(さまざまなメソッドと値の結果を含む-ランタイム7分):gist.github.com/ecki/ 399136f4fd59c1d110c1 (ネタバレ: "" + nウォン)。
eckes

5
バディに感謝しますが、私の答えは5年前です!JMHは2013年にのみリリースされました:P
Kingo

9

Javaソースから:

/**
 * Returns the string representation of the {@code int} argument.
 * <p>
 * The representation is exactly the one returned by the
 * {@code Integer.toString} method of one argument.
 *
 * @param   i   an {@code int}.
 * @return  a string representation of the {@code int} argument.
 * @see     java.lang.Integer#toString(int, int)
 */
public static String valueOf(int i) {
    return Integer.toString(i);
}

したがって、まったく同じ結果が得られ、実際には一方が他方を呼び出します。後で型を変更する可能性がある場合、String.valueOfはより柔軟です。


8

Stringクラスのソースコードを見るとInteger.toString()、を呼び出すと実際に呼び出されますvalueOf()

そうは言っても、Integer.toString()コンパイル時にメソッド呼び出しが最適化されていない場合(おそらくそうである場合)、少し速くなる可能性があります。


はい、 "" + nはさらに高速です。gist.github.com/ecki/399136f4fd59c1d110c1を
eckes

3

String.valueOf()ご覧の実装は、APIで指定されたコントラクトを満たす最も簡単な方法です。「表現は、1 Integer.toString()つの引数のメソッドによって返されるものとまったく同じです。」


2

OPの質問に答えるには、他の呼び出しを持つのは単なるヘルパーラッパーであり、スタイルの選択に行き着きます。ここには多くの誤った情報があると思います。Java開発者ができる最善のことは、各メソッドの実装を確認することです。これは、任意のIDEで1〜2回クリックするだけです。あなたはそれString.valueOf(int)が単に呼んでいることをはっきりと見るでしょうInteger.toString(int)あなたをてでしょう。

したがって、違いはまったくありません。どちらもcharバッファーを作成し、数値の数字を調べ、それを新しいStringにコピーして返します(したがって、それぞれが1つのStringオブジェクトを作成しています)。唯一の違いは、1つの追加の呼び出しであり、コンパイラーはとにかく単一の呼び出しに除外します。

したがって、コードの一貫性以外は、どちらを呼び出すかは重要ではありません。nullに関するコメントについては、プリミティブを使用するため、nullにすることはできません。渡されるintを初期化しないと、コンパイル時エラーが発生します。この場合、nullは存在しないため、nullの処理方法に違いはありません。


テキストをいくつかのブロックに分けてください。とても読みにくいです。
Magnilex、2015年

このOPには誤った情報がたくさんあります。あなたの投稿が私にとって最良の答えです!ありがとう
aksappy

1

この余分な呼び出しが効率の問題の原因になることを心配する必要はありません。費用があればそれは最小限であり、全体像では無視できるはずです。

おそらく両方が存在する理由は、読みやすさを提供するためです。に変換される多くのタイプのコンテキストではString、へのさまざまな呼び出しは、さまざまな呼び出しString.valueOf(SomeType)よりも読みやすくなる場合がありSomeType.toStringます。


1
実際、このような1行の呼び出しは、かなり迅速にインライン化されます。
Tassos Bassoukos

1 000 000時間を呼び出すループでもString.valueof()??
Manuel Selva

@マヌエル:あなたはそれをプロファイリングしましたか?ここにパフォーマンスの問題があることがわかりましたか?あなたが時期尚早に最適化していないと確信していますか?@タッソス:はい、それも可能性は高いですが、いずれにしても、プロファイリングでこの特定の呼び出しに問題があると言われていない限り、心配する必要はありません。
polygenelubricants

実際、マヌエル、1,000,000回のループは、1回または2回のループよりも頻繁にインライン化されると思います。それでも、ループの回数に関係なく、時間のごく一部になります。
corsiKa 2010

いいえ、ただし、アプリにはボトルネックがないと確信しています。ここでは読みやすさの問題が見当たらないため、これを尋ねています。したがって、ゲインが0の場合でも、より最適なコードを使用する必要があると思います。同意しませんか?
Manuel Selva、2010

1

私の始まりはvalueof()であり、表現のために常にtostring()と呼ばれるので、プリミティブ型のrpresentaionについてはvalueofが一般化されています。Javaはデフォルトでデータ型をサポートしていませんが、オブジェクトでクラスを定義し、クラスですべてのものを作成して作成しましたオブジェクト.here Integer.toString(int i)は、整数のみの変換という制限を作成します。


1

Integer.toString(5)とString.valueOf(5)の間に違いはありません。

String.valueOfは次を返すためです。

public static String valueOf(int i) {
    return Integer.toString(i);
}
public static String valueOf(float f) {
    return Float.toString(f);
}

等..


0

String.valueOf()メソッドを使用すると、データ(int、long、char、char []、boolean、Object)について心配する必要がなく、次のように呼び出すだけで済みます。

  • 静的文字列valueOf()

唯一の構文String.valueOf()を使用すると、パラメーターとして渡したものはすべてStringに変換されて返されます。

それ以外の場合、Integer.toString()、Float.toString()など(つまり、SomeType.toString())を使用する場合は、文字列に変換するパラメーターのデータ型を確認する必要があります。したがって、そのような変換にはString.valueOf()を使用する方が良いでしょう。

Integer、Char、Floatなどの異なる値を含むオブジェクトクラスの配列がある場合、String.valueOf()メソッドを使用することにより、そのような配列の要素を簡単に文字列形式に変換できます。逆に、SomeType.toString()を使用したい場合は、最初にそれらのデータ型クラス(多分「instanceOf」演算子を使用)を知っておく必要があり、それから型キャストに進むことができます。

String.valueOf()メソッドが呼び出されると、渡されたパラメーター(Integer、Char、Floatなど)に一致し、メソッドのオーバーロードを使用して、パラメーターが一致する "valueOf()"メソッドを呼び出し、そのメソッド内で対応する「toString()」メソッドへの直接呼び出し。

したがって、データ型をチェックしてから対応する「toString()」メソッドを呼び出すオーバーヘッドがどのように削除されるかを確認できます。必要なのは、Stringに変換するものを気にすることなく、String.valueOf()メソッドを呼び出すことだけです。

結論:String.valueOf()メソッドは、あと1回の呼び出しを犠牲にするだけで重要です。


-3

toString()

  1. Objectクラスに存在し、通常は派生クラスでオーバーライドされます
  2. toString()メソッドを呼び出すには、適切なクラスへの型キャストが必要です。

valueOf()

  1. Stringクラスに存在するオーバーロードされた静的メソッド。
  2. プリミティブ型とオブジェクト型を処理します。

    Integer a = null;
    System.out.println(Integer.toString()) ; NUll pointer exception
    System.out.println(String.valueOf() ; give NULL as value

このリンクをチェックしてください。http://code4reference.com/2013/06/which-one-is-better-valueof-or-tostring/

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