如何从int转换为String?

Den*_*sky 723 java

我工作的地方所有转换项目intString都是这样完成的:

int i = 5;
String strI = "" + i;
Run Code Online (Sandbox Code Playgroud)

我不熟悉Java.这是通常的做法,还是有些不对劲,正如我想的那样?

Sim*_*onJ 940

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

连接将起作用,但它是非常规的,可能是一种难闻的气味,因为它表明作者不知道上面的两种方法(他们还有什么不知道?).

当与字符串一起使用时,Java特别支持+运算符(请参阅文档),该字符串将您发布的代码翻译成:

StringBuilder sb = new StringBuilder();
sb.append("");
sb.append(i);
String strI = sb.toString();
Run Code Online (Sandbox Code Playgroud)

在编译时.它的效率稍差(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
Run Code Online (Sandbox Code Playgroud)

初始化StringBuilder:

   2:    new    #2; //class java/lang/StringBuilder
   5:    dup
   6:    invokespecial    #3; //Method java/lang/StringBuilder."<init>":()V
Run Code Online (Sandbox Code Playgroud)

附加空字符串:

   9:    ldc    #4; //String
   11:    invokevirtual    #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
Run Code Online (Sandbox Code Playgroud)

附加整数:

   14:    iload_1
   15:    invokevirtual    #6; //Method java/lang/StringBuilder.append:
(I)Ljava/lang/StringBuilder;
Run Code Online (Sandbox Code Playgroud)

提取最终字符串:

   18:    invokevirtual    #7; //Method java/lang/StringBuilder.toString:
()Ljava/lang/String;
   21:    astore_2
   22:    return
}
Run Code Online (Sandbox Code Playgroud)

有针对JDK 9的改进此行为的提案和正在进行的工作.

  • jvm中的jit编译器怎么样?:-) javac不进行任何花哨的优化. (9认同)
  • 谁知道:)当使用数字文字时,javac确实优化了这些表达式(例如`""+ 5`变为"5"`). (5认同)
  • 是的,但你为什么要做""+ 5"而不只是"5"​​? (5认同)
  • 太好了!为*他们可能不知道的其他内容+1?* (3认同)
  • 在[官方oracle教程之一]中使用了""+"整数"方法(https://docs.oracle.com/javaee/7/firstcup/creating-example002.htm#GCROI). (2认同)

duf*_*ymo 248

这是可以接受的,但我从来没有写过这样的东西.我更喜欢这个:

String strI = Integer.toString(i);
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢String.valueOf方法,因为您可以对任何类型使用完全相同的调用. (98认同)
  • 对于整数,默认情况下没有使用特定于文化的东西(根本没有小数或千位分隔符).这就是`NumberFormatter`的用途.您可以使用`NumberFormat.getInstance(Locale.FRENCH)`之类的格式. (3认同)
  • 对不起我的无知,但这不会使用当前的文化吗?我将成为一个.NET背景BTW. (2认同)

dar*_*ioo 109

这不是一个好方法.

在从int转换为string时,应该使用:

int i = 5;
String strI = String.valueOf(i);
Run Code Online (Sandbox Code Playgroud)

  • 你问空字符串; 你要求连接; 3.因为你没有字符串,所以你最终会将你的int转换成字符串.daridoo的解决方案避免了第一步. (7认同)

use*_*421 58

这不仅仅是优化1.我不喜欢

"" + i
Run Code Online (Sandbox Code Playgroud)

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

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

Integer.toString(i)
Run Code Online (Sandbox Code Playgroud)

或者,不是我的首选,但仍然比串联更好,获得一个对象的字符串表示(整数):

String.valueOf(i)
Run Code Online (Sandbox Code Playgroud)

1. 对于经常调用的代码,例如在循环中,优化肯定也是不使用串联的一点.

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

  • 在这种情况下谈论绩效的人会分散注意力。远,远,远,远,远,远更重要的是_可读性_。 (3认同)

Kon*_*lph 23

许多入门大学课程似乎都教这种风格,原因有二(根据我的经验):

  • 它不需要理解类或方法.通常,这是在提到"class"这个词之前教授的方式 - 甚至也不是方法调用.所以使用类似的东西String.valueOf(…)会让学生感到困惑.

  • 它是"运算符重载"的一个例子 - 实际上,这是作为惯用的重载运算符出售给我们(这里很奇怪,因为Java不允许自定义运算符重载).

因此它可能是出于教学必要性而产生的(尽管我认为这只是一种糟糕的教学方式),或者用来说明一种原则,否则在Java中很难证明.

  • 我认为相反的结构,如“”+我会混淆新手。而且这对他们的余生来说也是一种糟糕的风格。 (2认同)

And*_*s_D 16

表达方式

"" + i
Run Code Online (Sandbox Code Playgroud)

导致字符串转换i在运行时.表达式的整体类型是String.i首先转换为Integerobject(new Integer(i)),然后String.valueOf(Object obj)调用.所以它相当于

"" + String.valueOf(new Integer(i));
Run Code Online (Sandbox Code Playgroud)

显然,这比仅仅调用的性能稍差 String.valueOf(new Integer(i))会产生相同结果的.

优点""+i是打字更容易/更快,有些人可能会想,它更容易阅读.它不是代码味道因为它没有表明任何更深层次的问题.

(参考:JLS 15.8.1)

  • 关于代码气味的部分是正确的; 代码气味在这里是错误的术语.所以我将取消downvote. (4认同)
  • 您的"等效"声明不相同.即使调用`String.valueOf`需要装箱`i`(它没有,因为有一个接受`int`的重载),它不会使用`new Integer(i)`,它会使用`Integer .valueOf(ⅰ)`.但它确实没有做到这一点.它做了新的StringBuilder().append("").append(i).toString()`,作为SimonJ的回答说明.StringBuilder有自己的逻辑,用于将原语int`i`转换为String. (3认同)

小智 14

就个人而言,我在这段代码中没有看到任何不好的内容.

当你想记录一个int值时,它非常有用,而logger只接受一个字符串.我想说当你需要调用接受String的方法时,这样的转换很方便,但是你有一个int值.

至于之间的选择Integer.toString或者String.valueOf,它是偏爱的问题.
......在内部,顺便String.valueOf调用Integer.toString方法.:)


zne*_*eak 12

我所知道的另一种方式是来自Integer班级:

Integer.toString(int n);
Integer.toString(int n, int radix);
Run Code Online (Sandbox Code Playgroud)

一个具体的例子(虽然我认为你不需要):

String five = Integer.toString(5); // returns "5"
Run Code Online (Sandbox Code Playgroud)

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

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


Gre*_*att 9

这种技术是在十年前的一个本科水平的Java入门课程中讲授的.但是,我应该注意到,IIRC,我们还没有得到String和Integer类方法.

该技术简单快捷.如果我正在做的就是打印一些东西,我将使用它(例如,System.out.println("" + i);但是,我认为这不是进行转换的最佳方式,因为它需要花费一秒时间才能意识到当它被使用时会发生什么这种方式.此外,如果表现是一个问题,它似乎更慢(更低,以及在其他答案).

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

只是为了笑嘻嘻:)我写了一些类来测试这三种技术:""+ i,Integer.toString和String.ValueOf.每个测试只是将整数从1转换为10000到字符串.然后我通过Linux 时间命令运行了五次.Integer.toString()比String.valueOf()略快一次,它们绑三次,String.valueOf()更快一次; 然而,差异从未超过几毫秒.

除了一个测试之外,"+ +"技术比每个测试都慢,当它比Integer.toString()慢1毫秒,比String.valueOf()慢1毫秒时(显然在String.valueOf()的同一测试中比Integer.toString()更快.虽然它通常只慢了几毫秒,但有一个测试,它慢了大约50毫秒.YMMV.


小智 6

It depends on how you want to use your String. This can help:

String total =  Integer.toString(123) + Double.toString(456.789);
Run Code Online (Sandbox Code Playgroud)


小智 6

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

StringBuilder string = string.append(i).toString();
String string = String.valueOf(i);
String string = Integer.toString(i);
Run Code Online (Sandbox Code Playgroud)


Jay*_*Jay 5

主要是在 SimonJ 上同上。我真的不喜欢 ""+i 成语。如果您说 String.valueOf(i),Java 会将整数转换为字符串并返回结果。如果您说 ""+i,Java 将创建一个 StringBuilder 对象,向其附加一个空字符串,将整数转换为字符串,将其附加到 StringBuilder,然后将 StringBuilder 转换为 String。这是很多额外的步骤。我想如果你在一个大程序中做一次,那没什么大不了的。但是如果你一直这样做,你就会让计算机做一堆额外的工作,并创建所有这些额外的对象,然后必须清理它们。我不想狂热于微优化,但我也不想毫无意义地浪费。


Vih*_*rma 5

有三种转换为字符串的方法

  1. String string = "" + i;
  2. String string = String.valueOf(i);
  3. String string = Integer.toString(i);


小智 5

String strI = String.valueOf(i);

String string = Integer.toString(i);
Run Code Online (Sandbox Code Playgroud)

这两种方式都是正确的.


Hoq*_*dul 5

有很多种方法可以将整数转换为字符串:

1)

Integer.toString(10);
Run Code Online (Sandbox Code Playgroud)

2)

 String hundred = String.valueOf(100); // You can pass an int constant
 int ten = 10;
 String ten = String.valueOf(ten)
Run Code Online (Sandbox Code Playgroud)

3)

String thousand = "" + 1000; // String concatenation
Run Code Online (Sandbox Code Playgroud)

4)

String million = String.format("%d", 1000000)
Run Code Online (Sandbox Code Playgroud)