intからStringに変換するにはどうすればよいですか?


745

からintへのすべての変換が次のようStringに行われるプロジェクトに取り組んでいます:

int i = 5;
String strI = "" + i;

私はJavaに慣れていません。

これは通常の習慣ですか、それとも私が思うように間違っていますか?


47
「愚かな、簡単な」方法は、文字列=「」+整数です。
Fattie、


2
つまり、それはそれを行うための「迅速でシンプルな」方法です。少しばかげていますが、うまくいきます!
Fattie、2016

1
私の同僚がしましたInteger.valueOf(i).toString()。彼は物が好きだったに違いありません。それは彼の意図を非常に明確に述べていますが、私の好みには少し長いです。
Ole VV 2017年

5
必要なコードは45行だけで、それを行うには7つのインターフェイスを実装する必要があります。
スカ2017年

回答:


958

通常の方法は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を対象としています。


9
jvmのjitコンパイラはどうですか?:-) javacは空想的な最適化を行いません。
PeterŠtibraný2010年

5
誰が知っているか:) javacは、数値リテラルが使用されている場合(たとえば、に"" + 5なる場合"5")、この種の式を最適化します。
SimonJ

5
ええ、でも、なぜあなたは"" + 5代わりにそうするの"5"ですか?
Grungondola

3
いいね!
Sнаđошƒаӽ

2
この"" + integerアプローチは、オラクルの公式チュートリアルの1つで使用されています。
TomaszNocoń16年

252

それは許容範囲ですが、私はそのようなものを書いたことがありません。私はこれを好みます:

String strI = Integer.toString(i);

101
String.valueOfアプローチを使用します。これは、どのタイプでもまったく同じ呼び出しを使用できるためです。
Jon Skeet

1
NumberFormatterの方が良いアプローチです
Kasturi

良い答え、Kasturi。コメント以上のものを投稿します。
duffymo 2010年

2
私の無知のため申し訳ありませんが、これは現在の文化を使用しませんか?私は.NETバックグラウンドBTWから来ています。
ΕГИІИО

3
整数の場合、デフォルトで使用されているカルチャ固有のものはありません(小数点や桁区切り記号はまったくありません)。それNumberFormatterが目的です。のような形式を使用できますNumberFormat.getInstance(Locale.FRENCH)
2015

111

それは良い方法ではありません。

intからstringへの変換を行う場合、これを使用する必要があります。

int i = 5;
String strI = String.valueOf(i);

7
1.空の文字列を要求します。2.連結を要求します。3.文字列がないため、最後にintを文字列に変換します。daridooの解決策は最初のステップを避けます。
Nicolas

に追加される前にint iボックス化IntegerされString strIますか?
ケビンメレディス

1
@KevinMeredith、いいえ、そうではありません。あなたは実際に呼び出すでしょうStringBuilder.append(int)(そしてすべてのプリミティブ型のためStringBuilderappendメソッドがあります)。
2015

60

それは最適化だけではありません1。嫌い

"" + i

私が本当にやりたいことを表現していないから2

(空の)文字列に整数を追加したくありません。整数を文字列に変換したい:

Integer.toString(i)

または、私の好みではありませんが、連結よりも優れていますが、オブジェクトの文字列表現(整数)を取得します。

String.valueOf(i)

1. ループのように頻繁に呼び出されるコードの場合、最適化は連結を使用しないことのポイントでもあります

2. これは またはのような実際の連結の使用には無効ですSystem.out.println("Index: " + i); String id = "ID" + i;


3
この文脈でパフォーマンスについて話している人々は気晴らしです。はるかに、はるかに、はるかに、はるかに、はるかに、はるかに重要なのは読みやすさです。
ブライアンゲッツ

23

大学入門コースの多くは、このスタイルを教えているようですが、これには2つの理由があります(私の経験では)。

  • クラスやメソッドを理解する必要はありません。通常、これは「クラス」という言葉が言及される前に、メソッド呼び出しでさえも教えられます。のようなものを使用すると、String.valueOf(…)学生を混乱させるでしょう。

  • 実際には、これは私たちのように販売されていた-それは「演算子オーバーロード」の説明図である(Javaはカスタム演算子のオーバーロードを許可していないので、ここでは小さな不思議)慣用的なオーバーロード演算子。

したがって、それは教訓的な必要性から生まれるか(これは単なる悪い教えだと私は主張しますが)、Javaで実証するのが非常に難しい原則を説明するために使用されます。


2
逆に、 "" +のような構造は、初心者を混乱させると思います。そして、それは彼らの残りの人生にとって悪いスタイルです。
Konstantin Zyubin 2017

15

表現

"" + 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


3
「同等の」ステートメントは同等ではありません。String.valueOf必要なボクシングを呼び出したiとしても(そうしない、を受け入れるオーバーロードがあるためint)、を使用せずnew Integer(i)、を使用しますInteger.valueOf(i)。しかし、これは実際には何もしません。それはありませんnew StringBuilder().append("").append(i).toString()SimonJの答えのメモとして、。StringBuilderには、プリミティブint iをStringに変換するための独自のロジックがあります。
Mark Peters、

4
ただし、コードのにおいに関する部分は正しいです。コードの匂いはここでは間違った用語です。だから私は反対票を取ります。
Mark Peters、

"" + iでそれを行うのは非効率的です。単純なInteger.toStringまたはString.valueOfをお勧めします。javadevnotes.com/java-integer-to-string-examples
JavaDev

14

個人的に、私はこのコードに悪いことは何も見ていません。

これは、int値をログに記録する場合に非常に役立ち、ロガーは文字列を受け入れるだけです。Stringを受け入れるメソッドを呼び出す必要があるが、int値がある場合、このような変換は便利だと思います。

Integer.toStringまたはの選択については、String.valueOfすべて好みの問題です。
...そして内部的にString.valueOfは、Integer.toStringメソッドを呼び出します。:)


12

私が知っているもう1つの方法は、Integerクラスからのものです。

Integer.toString(int n);
Integer.toString(int n, int radix);

具体的な例(私はあなたが何かを必要とするとは思わないでしょうが):

String five = Integer.toString(5); // returns "5"

これは、他のプリミティブタイプ、たとえばでも機能しますDouble.toString

詳細はこちらをご覧ください。


9

この手法は、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


1
JITを考慮することを忘れないでください-最初のいくつかの変換ははるかに遅くなり、タイミングをゆがめます。私のMacBookでは、連結に他の2つの方法(どちらも変換あたり最大50ナノ秒)に比べて最大20ナノ秒かかるため、ミリ秒のオーダーで見た違いは、おそらくランダムエラー(スケジューリング、割り込みなど)によるものです。
SimonJ 2010年

6

文字列に変換するにはさまざまな方法があります。

StringBuilder string = string.append(i).toString();
String string = String.valueOf(i);
String string = Integer.toString(i);

StringBuilder string = string.append(i).toString(); ...うーん、それはStringBuilderですか、それともStringですか。ここに混乱があります...
フランタ2018年


5

主にSimonJについてです。"" + iイディオムが本当に嫌いです。String.valueOf(i)と言うと、Javaは整数を文字列に変換し、結果を返します。"" + iと言うと、JavaはStringBuilderオブジェクトを作成し、それに空の文字列を追加し、整数を文字列に変換し、これをStringBuilderに追加してから、StringBuilderを文字列に変換します。それは多くの追加ステップです。大規模なプログラムで一度実行したとしても、大した問題ではないでしょう。ただし、これを常に実行している場合は、コンピュータに大量の追加作業を実行させ、これらのすべての追加オブジェクトを作成して、それらをクリーンアップする必要があります。マイクロ最適化について熱狂的になりたくありませんが、無意味に無駄になりたくありません。



5

整数を文字列に変換する方法はたくさんあります:

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)

1
String.format( "%d"、1000000)...これは実際にはInt >> String変換ではなく、オーバーロードされているにもかかわらず、ここではむしろString >> String処理です。だから私はこれを勧めません。間違いなく単なる変換の目的ではありません。
フランタ2018年


3

"" + iの使用は、数値を文字列に変換する最も簡単な方法です。これは最も効率的ではありませんが、最も明確なIMHOであり、通常はそれがより重要です。コードが単純であるほど、間違いを犯す可能性が低くなります。


2
String.valueOfまたはInteger.toStringの呼び出しをどのように間違えるでしょうか?
エヴァ

1
String.valueOf()の非理想的な使用法をいくつか見つけましたが、今は覚えていません。出力は正しかったが、それよりも効率が低かった""+i
Peter Lawrey

2

個人的には、 "" + 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セントになると思います。笑...



-5

単純な型キャストを試す

char c = (char) i;

3
これは、intを文字列に変換する良い方法ではありません。実際には、intを文字列に変換するのではなく、intをcharに変換します。これは、intをASCII文字コードとして解釈し、その文字を提供します。これは危険で(負の値など)、全体としては明らかに間違っています。
Nepoxx 14

上記の質問をクリアしてください。charとStringの両方が異なります...!

しかし、これは機能します(ASCII文字セット「オフセット」):char c = (char) (i + 48);
electrobabe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.