からint
へのすべての変換が次のようString
に行われるプロジェクトに取り組んでいます:
int i = 5;
String strI = "" + i;
私はJavaに慣れていません。
これは通常の習慣ですか、それとも私が思うように間違っていますか?
Integer.valueOf(i).toString()
。彼は物が好きだったに違いありません。それは彼の意図を非常に明確に述べていますが、私の好みには少し長いです。
からint
へのすべての変換が次のようString
に行われるプロジェクトに取り組んでいます:
int i = 5;
String strI = "" + i;
私はJavaに慣れていません。
これは通常の習慣ですか、それとも私が思うように間違っていますか?
Integer.valueOf(i).toString()
。彼は物が好きだったに違いありません。それは彼の意図を非常に明確に述べていますが、私の好みには少し長いです。
回答:
通常の方法はInteger.toString(i)
またはString.valueOf(i)
です。
連結は機能しますが、作者が上記の2つの方法を知らないことを示唆しているため、従来とは異なり、悪臭である可能性があります(他に何が知られていないのでしょうか?)。
Javaは、ポストしたコードを変換する文字列(ドキュメントを参照)と一緒に使用すると、+演算子を特別にサポートします。
StringBuilder sb = new StringBuilder();
sb.append("");
sb.append(i);
String strI = sb.toString();
コンパイル時。これは少し効率的ではありませんが(sb.append()
結局のところを呼び出すInteger.getChars()
ことにInteger.toString()
なります)、機能します。
Grodriguezのコメントに答えるには:**いいえ、この場合、コンパイラーは空の文字列を最適化しません -見てください:
simon@lucifer:~$ cat TestClass.java
public class TestClass {
public static void main(String[] args) {
int i = 5;
String strI = "" + i;
}
}
simon@lucifer:~$ javac TestClass.java && javap -c TestClass
Compiled from "TestClass.java"
public class TestClass extends java.lang.Object{
public TestClass();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_5
1: istore_1
StringBuilderを初期化します。
2: new #2; //class java/lang/StringBuilder
5: dup
6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
空の文字列を追加します。
9: ldc #4; //String
11: invokevirtual #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
整数を追加します。
14: iload_1
15: invokevirtual #6; //Method java/lang/StringBuilder.append:
(I)Ljava/lang/StringBuilder;
最終的な文字列を抽出します。
18: invokevirtual #7; //Method java/lang/StringBuilder.toString:
()Ljava/lang/String;
21: astore_2
22: return
}
この動作を変更するための提案と進行中の作業があり、JDK 9を対象としています。
"" + 5
なる場合"5"
)、この種の式を最適化します。
"" + 5
代わりにそうするの"5"
ですか?
"" + integer
アプローチは、オラクルの公式チュートリアルの1つで使用されています。
それは許容範囲ですが、私はそのようなものを書いたことがありません。私はこれを好みます:
String strI = Integer.toString(i);
NumberFormatter
が目的です。のような形式を使用できますNumberFormat.getInstance(Locale.FRENCH)
。
それは良い方法ではありません。
intからstringへの変換を行う場合、これを使用する必要があります。
int i = 5;
String strI = String.valueOf(i);
int i
ボックス化Integer
されString strI
ますか?
StringBuilder.append(int)
(そしてすべてのプリミティブ型のためStringBuilder
のappend
メソッドがあります)。
それは最適化だけではありません1。嫌い
"" + i
私が本当にやりたいことを表現していないから2。
(空の)文字列に整数を追加したくありません。整数を文字列に変換したい:
Integer.toString(i)
または、私の好みではありませんが、連結よりも優れていますが、オブジェクトの文字列表現(整数)を取得します。
String.valueOf(i)
1. ループのように頻繁に呼び出されるコードの場合、最適化は連結を使用しないことのポイントでもあります。
2. これは、 またはのような実際の連結の使用には無効ですSystem.out.println("Index: " + i);
String id = "ID" + i;
大学入門コースの多くは、このスタイルを教えているようですが、これには2つの理由があります(私の経験では)。
クラスやメソッドを理解する必要はありません。通常、これは「クラス」という言葉が言及される前に、メソッド呼び出しでさえも教えられます。のようなものを使用すると、String.valueOf(…)
学生を混乱させるでしょう。
実際には、これは私たちのように販売されていた-それは「演算子オーバーロード」の説明図である(Javaはカスタム演算子のオーバーロードを許可していないので、ここでは小さな不思議)慣用的なオーバーロード演算子。
したがって、それは教訓的な必要性から生まれるか(これは単なる悪い教えだと私は主張しますが)、Javaで実証するのが非常に難しい原則を説明するために使用されます。
表現
"" + i
リード文字列変換のi
実行時に。式の全体的なタイプはString
です。i
最初にInteger
オブジェクト(new Integer(i)
)に変換され、次にString.valueOf(Object obj)
呼び出されます。だからそれは
"" + String.valueOf(new Integer(i));
明らかに、これは単に呼び出すよりもパフォーマンスが少し低くString.valueOf(new Integer(i))
、同じ結果を生成します。
の利点""+i
は、タイピングがより簡単/高速であり、一部の人々は読みやすいと考えるかもしれません。より深い問題を示すものではないため、コードのにおいではありません。
(参照:JLS 15.8.1)
String.valueOf
必要なボクシングを呼び出したi
としても(そうしない、を受け入れるオーバーロードがあるためint
)、を使用せずnew Integer(i)
、を使用しますInteger.valueOf(i)
。しかし、これは実際には何もしません。それはありませんnew StringBuilder().append("").append(i).toString()
SimonJの答えのメモとして、。StringBuilderには、プリミティブint i
をStringに変換するための独自のロジックがあります。
私が知っているもう1つの方法は、Integer
クラスからのものです。
Integer.toString(int n);
Integer.toString(int n, int radix);
具体的な例(私はあなたが何かを必要とするとは思わないでしょうが):
String five = Integer.toString(5); // returns "5"
これは、他のプリミティブタイプ、たとえばでも機能しますDouble.toString
。
この手法は、10年以上前に受けた学部レベルのJava入門クラスで教えられました。ただし、IIRCでは、StringおよびIntegerクラスのメソッドをまだ取得していないことに注意してください。
テクニックはシンプルで素早く入力できます。私がしているすべてが何かを印刷することなら、それを使用します(たとえば、System.out.println("" + i);
です。ただし、それが使用されているときに何が起こっているのかを理解するのに少し時間がかかるため、変換を行うには最良の方法ではないと思いますまた、パフォーマンスが問題になる場合は、遅くなるように見えます(以下で説明するほか、他の回答でも)。
個人的には、何が起こっているのかは明らかなので、Integer.toString()を好みます。String.valueOf()は、混乱しているように見えるため、2番目の選択肢です(dariooの回答の後のコメントを参照してください)。
にこにこだけ:)私は3つのテクニックをテストするためにクラスを書きました: "" + i、Integer.toString、およびString.ValueOf。各テストでは、intを1から10000から文字列に変換しました。その後、Linuxの時間をそれぞれ実行しましたコマンドをそれぞれ5回実行しました。Integer.toString()は、1回はString.valueOf()よりもわずかに高速で、3回タイになり、String.valueOf()は1回高速でした。ただし、その差は数ミリ秒を超えることはありません。
Integer.toString()よりも1ミリ秒速く、String.valueOf()よりも1ミリ秒遅い "" + i手法は、1つを除くすべてのテストで両方よりも遅くなりました(明らかに、同じテストでは、String.valueOf() Integer.toString()よりも高速でした。通常はわずか数ミリ秒遅くなりましたが、約50ミリ秒遅くなるテストが1つありました。YMMV。
文字列の使用方法によって異なります。これは役立ちます:
String total = Integer.toString(123) + Double.toString(456.789);
主にSimonJについてです。"" + iイディオムが本当に嫌いです。String.valueOf(i)と言うと、Javaは整数を文字列に変換し、結果を返します。"" + iと言うと、JavaはStringBuilderオブジェクトを作成し、それに空の文字列を追加し、整数を文字列に変換し、これをStringBuilderに追加してから、StringBuilderを文字列に変換します。それは多くの追加ステップです。大規模なプログラムで一度実行したとしても、大した問題ではないでしょう。ただし、これを常に実行している場合は、コンピュータに大量の追加作業を実行させ、これらのすべての追加オブジェクトを作成して、それらをクリーンアップする必要があります。マイクロ最適化について熱狂的になりたくありませんが、無意味に無駄になりたくありません。
整数を文字列に変換する方法はたくさんあります:
1)
Integer.toString(10);
2)
String hundred = String.valueOf(100); // You can pass an int constant
int ten = 10;
String ten = String.valueOf(ten)
3)
String thousand = "" + 1000; // String concatenation
4)
String million = String.format("%d", 1000000)
"" + iの使用は、数値を文字列に変換する最も簡単な方法です。これは最も効率的ではありませんが、最も明確なIMHOであり、通常はそれがより重要です。コードが単純であるほど、間違いを犯す可能性が低くなります。
""+i
個人的には、 "" + iは元の質問の投稿者が "臭い"と述べているように見えます。私はJava以外にも多くのオブジェクト指向言語を使用しています。その構文が適切であることが意図されていた場合、Javaは、文字列に変換するために必要な「」を必要とせずに、iのみを解釈して実行します。これは、宛先の型が明確であり、右側に単一の値のみが提供されるためです。 。もう1つはコンパイラーをだますための「トリック」のようです。コードを移植する必要がある場合、他のメーカーまたは他のプラットフォームで作成された異なるバージョンのJavacを検討すると、モジョが悪くなります。私のお金のために、他の多くのOOLと同じようにする必要がありますタイプキャストを取る:(String)i。winks
私の学習方法を考えると、他のコードをすばやく読むときにそのような構造を理解しやすくするために、Integer.toString(i)メソッドに投票します。Javaがバックグラウンドで物事を実装する方法とString.valueOf(i)のnsまたは2つを忘れて、このメソッドは私には正しいと感じ、何が起こっているかを正確に言います。私はIntegerを持っていて、それをStringに変換したいと思います。
数回行った良い点は、おそらくStringBuilderを前もって使用することは、テキストとintまたは他のオブジェクトが混在する文字列を作成することに対する良い答えです。
ちょうど2つのセントがマンズの質問への回答のすでに支払われた子猫に投げ込まれただけ... 笑顔
いくつかの反射の後、自分の答えに編集します。
OK、OK、これについてもう少し考えていましたが、String.valueOf(i)も完全に優れています。つまり、Integerの値を表すStringが必要です。笑、英語はJavaよりもはるかに解析が難しいです!しかし、私は私の答え/コメントの残りを残します...可能な場合は常にメソッド/関数チェーンの最低レベルを使用するように教えられましたが、それでも読み取り可能性を維持しているので、String.valueOfがInteger.toStringを呼び出す場合は、なぜオレンジ全体を使用するのですか?とにかくそれをはがすなら、うーん?
StringBuilderに関する私のコメントを明確にするために、私はほとんどリテラルテキストとintのコンボで多くの文字列を構築し、それらは+の間に埋め込まれた上記のルーチンへの呼び出しで長くて醜くなり、それらがとにかくSBオブジェクトと追加メソッドにはオーバーロードがあり、先に進んでそれを使用する方がクリーンな場合があります...だから、私は今、この1つで最大5セントになると思います。笑...
単純な型キャストを試す
char c = (char) i;
char c = (char) (i + 48);