如何从int转换为String?


745

我正在一个项目中,所有从int到的转换String都是这样完成的:

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

我对Java不熟悉。

我想这是通常的做法还是出了什么问题?


47
“傻,易”的方式是串=“” +整数;
Fattie


2
我只是说,这是一种“快速,简单”的方法。这有点愚蠢,但有效!
Fattie

1
我的一个同事做到了Integer.valueOf(i).toString()。他一定是喜欢物体的。虽然很清楚地表明了他的意图,但我的品味还有些长。
Ole VV

5
您只需要45行代码,并实现7个接口即可。
Ska

Answers:


958

正常的方式是Integer.toString(i)String.valueOf(i)

串联可以工作,但是它是非常规的,可能是一种难闻的气味,因为它表明作者不了解上述两种方法(他们可能还不知道什么?)。

当与字符串一起使用时,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ý10年

5
谁知道:)使用数字文字时,javac确实优化了这类表达式(例如,"" + 5变为"5")。
SimonJ 2010年

5
是的,但是为什么您会做"" + 5而不仅仅是"5"
Grungondola

3
真好!+1 他们可能还不知道的什么?
Sнаđошƒаӽ

2
"" + integer方法在正式的Oracle教程之一中使用。
TomaszNocoń16年

252

这是可以接受的,但我从未写过类似的文章。我更喜欢这样:

String strI = Integer.toString(i);

101
我更喜欢String.valueOf方法,因为您可以对任何类型使用完全相同的调用。
乔恩·斯基特

1
NumberFormatter是一种更好的方法
Kasturi 2010年

Kasturi,一个很好的答案。我将其发布为评论以外的内容。
duffymo,2010年

2
抱歉,我的无知,但是会不会使用当前的文化?我来自.NET背景BTW。
ΕГИІИО

3
对于整数,默认情况下不使用特定于区域性的内容(根本没有小数或千位分隔符)。那NumberFormatter是为了什么 您可以使用类似的格式NumberFormat.getInstance(Locale.FRENCH)
凯特2015年

111

这不是一个好方法。

从int转换为字符串时,应使用:

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

7
1.您要求输入空字符串;2.您要求串联;3.由于没有字符串,您最终将int转换为字符串。daridoo的解决方案避免了第一步。
尼古拉斯

int i得到盒装到Integer获取添加到之前String strI
凯文·梅瑞迪斯

1
@KevinMeredith,不,不是。您实际上会在调用StringBuilder.append(int)(并且StringBuilder有一个append用于所有原始类型的方法)。
2015年

60

不仅是优化1。我不喜欢

"" + i

因为它没有表达我真正想做的事情2

我不想将整数附加到(空)字符串。我想将整数转换为字符串:

Integer.toString(i)

或者,不是我喜欢的,但是比连接更好,它得到对象的字符串表示形式(整数):

String.valueOf(i)

1. 对于经常调用的代码(例如in循环),确保确保优化也是不使用串联的重点

2. 这对于使用 或中真实串联是无效的System.out.println("Index: " + i); String id = "ID" + i;


3
在这种情况下谈论绩效的人们会分心。远,远,远,远,远,远更重要的是可读性
Brian Goetz

23

大学的许多入门课程似乎都采用这种风格,这有两个原因(以我的经验):

  • 它不需要了解类或方法。通常,这是在没有提到“类”一词的情况下进行的,甚至是方法调用之前都没有讲授。因此,使用类似的东西String.valueOf(…)会使学生困惑。

  • 这是“运算符重载”的说明–实际上,它是作为惯用的重载运算符出售给我们(这里难怪,因为Java不允许自定义运算符重载)。

因此,它可能是出于教学上的必要性而诞生的(尽管我会认为这只是不好的教导),或者可能被用来说明一个用Java很难证明的原理。


2
我认为相反地,像“” +这样的构造会使新手感到困惑。而且这对他们的余生都是一种不良的风格。
康斯坦丁·祖宾

15

表达方式

"" + i

导致字符串转换i在运行时。表达式的整体类型为Stringi首先转换为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 2010年

4
但是,有关代码气味的部分是正确的。代码气味是这里的错误术语。因此,我将投票。
Mark Peters 2010年

用“” + 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

我知道的另一种方法是从Integer班级:

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

一个具体的例子(尽管我认为您不需要):

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

例如,它也适用于其他原始类型Double.toString

有关更多详细信息,请参见此处。


9

十多年前,我在一个大学级别的Java入门课程中教授了该技术。但是,我要注意的是,IIRC,我们尚未使用String和Integer类方法。

该技术简单快捷。如果我正在做的只是打印某些东西,我将使用它(例如,System.out.println("" + i);。。但是,我认为这不是进行转换的最佳方法,因为花一秒钟的时间才能意识到正在使用的内容同样,如果性能是一个问题,它似乎会比较慢(下面还有更多答案以及其他答案)。

就个人而言,我更喜欢Integer.toString(),因为很明显发生了什么。String.valueOf()将是我的第二选择,因为它似乎令人困惑(见证darioo回答后的评论)。

只是为了笑:)我编写了类来测试三种技术:“” + i,Integer.toString和String.ValueOf。每个测试仅将整数从1转换为10000到字符串。然后,我分别通过Linux time命令运行了五次。Integer.toString()一次比String.valueOf()快一点,它们绑定了三倍,而String.valueOf()一次快。但是,两者之间的差异不会超过几毫秒。

“” + i技术在每个测试中都比两个测试都要慢,当时它比Integer.toString()快1毫秒,比String.valueOf()慢1毫秒(显然在同一测试中,String.valueOf()比Integer.toString()更快。虽然通常只慢几毫秒,但有一项测试却慢了约50毫秒。YMMV


1
别忘了将JIT考虑在内-前几次转换会变慢得多,并且会扭曲时间安排。在我的MacBook上,级联所花的时间比其他两种方法要长20ns(每次转换都需要50ns),因此,您看到的毫秒级差异可能是由于随机错误(调度,中断等)引起的。
SimonJ

6

有多种转换为字符串的方法:

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

StringBuilder字符串= string.append(i).toString(); ...嗯,是StringBuilder还是String?这里有些混乱...
Franta


5

大多数情况与SimonJ相同。我真的不喜欢“ + i”成语。如果您说String.valueOf(i),则Java会将整数转换为字符串并返回结果。如果您说“ + i”,则Java创建一个StringBuilder对象,向其附加一个空字符串,将整数转换为字符串,将该整数附加至StringBuilder,然后将StringBuilder转换为String。这是很多额外的步骤。我想如果您在大型程序中执行一次,那没什么大不了的。但是,如果您一直在执行此操作,则意味着使计算机进行了大量额外的工作,并创建了所有这些额外的对象,然后必须对其进行清理。我不想对微优化感到狂热,但我也不想毫无意义地浪费时间。



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处理。因此,我不建议这样做。绝对不只是为了转换。
弗兰塔


3

使用“” + i是将数字转换为字符串的最短,最简单的方法。它不是最有效的,但是它是最清晰的恕我直言,通常更重要。代码越简单,您犯错误的可能性就越小。


2
调用String.valueOf或Integer.toString怎么会出错?
伊娃(Eva)2012年

1
我遇到了String.valueOf()的一些非理想用法,但我现在不记得了。尽管输出正确,但效率却不如""+i
Peter Lawrey

2

我个人认为,“ +”确实看起来像原始问题发帖人所说的“臭”。除了Java外,我还使用了很多OO语言。如果该语法是适当的,那么Java将仅解释i而不需要将所需的“”转换为字符串,然后执行此操作,因为目标类型是明确的,并且仅在右侧提供一个值。如果需要移植代码,另一个似乎是愚弄编译器的“把戏”,当考虑其他制造商或其他平台生产的Javac的不同版本时,糟糕的Mojo。进行类型转换:(字符串)i。眨眼

考虑到我的学习方式以及为了便于理解,当快速阅读其他代码时,我赞成使用Integer.toString(i)方法。相对于String.valueOf(i),在Java如何在后台实现事物的过程中,只需花一两秒的时间,这种方法对我来说是正确的,并且可以准确地说出正在发生的事情:我拥有和Integer,希望将其转换为String。

几次提出的好处是,也许只是预先使用StringBuilder是构建混合了文本和int或其他对象的String的好答案,因为多数民众赞成在后台使用什么呢?

只是将我的两分钱扔进了芒斯问题答案中本已收入很高的小猫中…… 微笑

在反射后编辑我自己的答案:

好吧,好吧,我在考虑更多,String.valueOf(i)也非常好,它说:我想要一个代表整数值的String。大声笑,英语比Java更难解析!但是,我保留其余的答案/评论...我总是被教导尽可能使用方法/函数链的最低级别,并且仍然保持可读性,因此如果String.valueOf调用Integer.toString,那么为什么要使用整个橙色如果你还是要去皮,嗯?

为了澄清我对StringBuilder的评论,我用大量的文字文本和int组合构建了很多字符串,并且由于对嵌入在+之间的上述例程的调用而变得冗长而丑陋,所以在我看来,如果这些变得无论如何,SB对象和append方法都有重载,所以继续使用它可能会更干净...所以我想我现在最多可以得到5美分,是吗?大声笑...



-5

尝试简单的类型转换

char c = (char) i;

3
这不是将int转换为字符串的好方法。实际上,您不是将int转换为字符串,而是将int转换为char。这会将int解释为ASCII字符代码,并为您提供该char。这很危险(负值等),总体上是完全错误的。
Nepoxx

请清除上面的问题,char和String都不同...!

但这有效(ASCII字符集“偏移”):char c = (char) (i + 48);
electrobabe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.