なぜメソッドString.valueOf(int i)
が存在するのでしょうか?この方法を使用して変換していますint
しString
て発見しましたInteger.toString(int i)
。
これらのメソッドの実装を調べたところ、最初のメソッドが2番目のメソッドを呼び出していることがわかりました。結果として、私のすべての呼び出しにString.valueOf(int i)
は、直接呼び出すよりも1つ多くの呼び出しが含まれます。Integer.toString(int i)
なぜメソッドString.valueOf(int i)
が存在するのでしょうか?この方法を使用して変換していますint
しString
て発見しましたInteger.toString(int i)
。
これらのメソッドの実装を調べたところ、最初のメソッドが2番目のメソッドを呼び出していることがわかりました。結果として、私のすべての呼び出しにString.valueOf(int i)
は、直接呼び出すよりも1つ多くの呼び出しが含まれます。Integer.toString(int i)
回答:
同じことを行うための2つの異なる方法。それは歴史的な理由かもしれません(一方が他方の前に来たかどうか思い出せません)。
文字列型には、いくつかのメソッド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つの変更を行う必要があります。
私の結論では、valueOf
Stringクラスのメソッドを使用する方がより柔軟であり、それがそこで利用できる理由です。
Integer.toString(int i, int radix)
、それが10以外のベースの文字列に変換されることを忘れないでください
String.valueOf(int)
、を使用String.format("%d",i);
して詳細を読むことができます。このWebサイトにアクセスしてください。docs.oracle.com/ javase / 6 / docs / api / java / util / Formatter.html
int i = new Integer("1");
を行うことができ、その逆もできるので、それは賢いです。
大きな違いの1つtoString()
は、nullオブジェクトを呼び出すとaが返されNullPointerException
、使用String.valueOf()
するとnullをチェックできない場合があることです。
Integer i = null;
i.toString(); // Null pointer exception!!
String.valueOf(i); // No exception
String.valueOf(int i)
が、方法をString.valueOf(Object obj)
。とにかく、問題はint
、の可能性がないプリミティブな値についてですnull
。
Integer.toString()
たInteger.toString(int i)
。これは静的メソッドです(docs.oracle.com/javase/7/docs/api/java/lang/…)。
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));
}
}
String j
が使用しないため。基礎となるコンパイラがこれを最適化している可能性があります。別のメソッドでjオブジェクトを渡し、いくつかのダミー操作を行うことをお勧めします。
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はより柔軟です。
String
クラスのソースコードを見るとInteger.toString()
、を呼び出すと実際に呼び出されますvalueOf()
。
そうは言っても、Integer.toString()
コンパイル時にメソッド呼び出しが最適化されていない場合(おそらくそうである場合)、少し速くなる可能性があります。
String.valueOf()
ご覧の実装は、APIで指定されたコントラクトを満たす最も簡単な方法です。「表現は、1 Integer.toString()
つの引数のメソッドによって返されるものとまったく同じです。」
OPの質問に答えるには、他の呼び出しを持つのは単なるヘルパーラッパーであり、スタイルの選択に行き着きます。ここには多くの誤った情報があると思います。Java開発者ができる最善のことは、各メソッドの実装を確認することです。これは、任意のIDEで1〜2回クリックするだけです。あなたはそれString.valueOf(int)
が単に呼んでいることをはっきりと見るでしょうInteger.toString(int)
あなたをてでしょう。
したがって、違いはまったくありません。どちらもcharバッファーを作成し、数値の数字を調べ、それを新しいStringにコピーして返します(したがって、それぞれが1つのStringオブジェクトを作成しています)。唯一の違いは、1つの追加の呼び出しであり、コンパイラーはとにかく単一の呼び出しに除外します。
したがって、コードの一貫性以外は、どちらを呼び出すかは重要ではありません。nullに関するコメントについては、プリミティブを使用するため、nullにすることはできません。渡されるintを初期化しないと、コンパイル時エラーが発生します。この場合、nullは存在しないため、nullの処理方法に違いはありません。
この余分な呼び出しが効率の問題の原因になることを心配する必要はありません。費用があればそれは最小限であり、全体像では無視できるはずです。
おそらく両方が存在する理由は、読みやすさを提供するためです。に変換される多くのタイプのコンテキストではString
、へのさまざまな呼び出しは、さまざまな呼び出しString.valueOf(SomeType)
よりも読みやすくなる場合がありSomeType.toString
ます。
私の始まりはvalueof()であり、表現のために常にtostring()と呼ばれるので、プリミティブ型のrpresentaionについてはvalueofが一般化されています。Javaはデフォルトでデータ型をサポートしていませんが、オブジェクトでクラスを定義し、クラスですべてのものを作成して作成しましたオブジェクト.here Integer.toString(int i)は、整数のみの変換という制限を作成します。
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);
}
等..
String.valueOf()メソッドを使用すると、データ(int、long、char、char []、boolean、Object)について心配する必要がなく、次のように呼び出すだけで済みます。
唯一の構文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回の呼び出しを犠牲にするだけで重要です。
toString()
valueOf()
プリミティブ型とオブジェクト型を処理します。
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/