如何从int转换为String?

我正在做一个项目,从intString所有转换都是这样完成的:

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

我不熟悉Java。 按照我的设想,这是一种惯常的做法还是错误的?

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

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

与string一起使用时,Java特别支持+运算符(请参阅文档 ),这些string将您发布的代码转换为:

 StringBuilder sb = new StringBuilder(); sb.append(""); sb.append(i); String strI = sb.toString(); 

在编译时。 效率稍差( sb.append()最后调用Integer.getChars() ,这就是Integer.toString()会做的),但它的工作原理。

回答Grodriguez的评论:**不,编译器在这种情况下不会优化空string – 看:

 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 

附加空string:

  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; 

提取最后的string:

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

有一个build议和正在进行的工作来改变这个行为,针对JDK 9。

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

 String strI = Integer.toString(i); 

这不是一个好方法。

当从int转换为string时,应该使用以下内容:

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

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

 "" + i 

因为它没有expression我真正想做的事情。

我不想将一个整数附加到(空)string。 我想将整数转换为string:

 Integer.toString(i) 

或者,不是我的首选,但仍然比连接更好,得到一个对象(整数)的string表示forms:

 String.valueOf(i) 

1. 对于经常调用的代码,就像在循环中一样,优化肯定也是不使用连接的一个要点

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

  • 它不需要了解类或方法。 通常情况下,在“类”这个词被提到之前就已经被教过了,甚至没有方法调用。 所以使用像String.valueOf(…)东西会混淆学生。

  • 这是“运算符重载”的一个例子 – 事实上,这是作为惯用的重载运算符(这里的小奇迹,因为Java不允许自定义运算符重载)出售给我们。

所以它可能是出于教育的必要性(虽然我认为这只是一个糟糕的教学),或者用来说明一个原理,否则很难在Java中演示。

expression方式

 "" + i 

导致i在运行时的string转换 。 expression式的整体types是Stringi首先转换为一个Integer对象( new Integer(i) ),然后String.valueOf(Object obj)被调用。 所以相当于

 "" + String.valueOf(new Integer(i)); 

很明显,这比仅仅调用String.valueOf(new Integer(i))性能略低一些,这将产生相同的结果。

""+i的优点是打字更容易/更快,有些人可能会想,阅读起来更容易。 这不是一个代码气味,因为它不表示任何更深的问题。

(参考: JLS 15.8.1 )

就我个人而言,在这段代码中我看不出有什么不好的地方。

当你想logging一个int值时,这个logging器非常有用,并且logging器只接受一个string。 当你需要调用一个接受String的方法时,我会说这样的转换很方便,但是你有一个int值。

至于Integer.toStringString.valueOf之间的select,这都是一个品味问题。 String.valueOf通过这种方式调用Integer.toString方法:)

我知道的另一种方法是从Integer类中获得:

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

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

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

它也适用于其他基本types,例如Double.toString

在这里看到更多的细节。

这项技术是在我十年前接受的本科级别的Java课程中教授的。 但是,我应该注意到,IIRC,我们还没有得到String和Integer类的方法。

该技术简单快捷。 如果我正在做的是打印一些东西,我会使用它(例如, System.out.println("" + i);但是,我认为这不是做转换的最好方法,因为它需要一个第二个想法是,当它被这样使用时,意识到发生了什么事情,而且,如果性能是一个问题,它似乎更慢(更多的下面,以及其他答案)。

就个人而言,我更喜欢Integer.toString(),因为很明显发生了什么事情。 String.valueOf()将是我的第二select,因为它似乎是混淆(见证达里奥答案后的意见)。

只是为了grind :)我写了类来testing三种技术:“”+我,Integer.toString和String.ValueOf。 每个testing只是将1到10000的整数转换为string。 然后我运行了五次Linux 时间命令。 Integer.toString()比String.valueOf()稍微快了一次,它们绑定了三次,而String.valueOf()则更快一次; 然而,差异不会超过几毫秒。

除了一个testing(比Integer.toString()快1毫秒)和1毫秒比String.valueOf()(显然是在同一个testing中的String.valueOf()比Integer.toString()更快)。 虽然通常只有几毫秒慢,但是有一次testing比较慢了大约50毫秒。 YMMV 。

有很多种转换为string的方法:

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

这取决于你想如何使用你的string。 这可以帮助:

 String total = Integer.toString(123) + Double.toString(456.789); 
 String strI = String.valueOf(i); String string = Integer.toString(i); 

这两种方式都是正确的。

大部分同样在SimonJ上。 我真的不喜欢“”+我的成语。 如果你说String.valueOf(i),Java将整数转换为一个string并返回结果。 如果你说“”+我,Java创build一个StringBuilder对象,附加一个空string,将整数转换为一个string,将其附加到StringBuilder,然后将StringBuilder转换为一个string。 这是很多额外的步骤。 我想如果你在一个大项目中做过一次,那没什么大不了的。 但是如果你一直在做这个,那么你就是让电脑做了一堆额外的工作,创造出所有这些额外的东西,然后再清理掉。 我不想迷恋微观优化,但我也不想毫无意义地浪费。

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

有很多方法可以将整数转换为string:

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) 

就我个人而言,我认为“”+我看起来像原来的问题海报状态“臭”。 除了Java之外,我还使用了很多OO语言。 如果这种语法的目的是合适的话,那么Java就可以单独解释i,而不需要根据需要将string转换为string,因为目的地types是明确的,只有一个值会被提供给右边。 另一个看起来像是欺骗编译器的一个“技巧”,当其他厂商或其他平台的不同版本的Javac被认为是需要移植代码的时候,它就是一个“窍门”。为了我的钱,它应该和其他许多OOL一样采取一个types:(string)我眨眼

鉴于我的学习方式,并为了便于理解这样的构造时快速读取其他代码我投票Integer.toString(i)方法。 在Java中如何在后台实现东西时忘了一两个字符与String.valueOf(i)这个方法对我来说是正确的,并且说到底发生了什么:我有和Integer,我希望它转换为String。

一个好的观点可能只是使用StringBuilder来构buildStrings混合了文本和整数或者其他对象,因为那会在背景中使用什么呢?

只是我的两分钱投入已经支付给芒问题的答案猫咪微笑

编辑我自己的答案后,一些反思:

好的,好吧,我想这更多,String.valueOf(i)也是非常好,它说:我想要一个string,表示一个Integer的值。 大声笑,英语是更难parsing,然后爪哇! 但是,我留下了我的答案/评论的其余部分…我总是教如何尽可能使用最低级别的方法/函数链,并仍然保持可读性,所以如果String.valueOf调用Integer.toString那么为什么使用整个橙如果你只是要剥掉它,嗯?

为了澄清我对StringBuilder的评论,我创build了大量string,其中大部分是文本和int的组合,并且调用了上面提到的嵌套在+之间的例程的冗长和丑陋,所以在我看来,如果这些SB对象反正和附加方法有重载,它可能会更干净,只是继续使用它…所以我想我现在高达5美分,现在呢? 大声笑…

有三种转换为string的方法

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

有许多不同types的wat将Integer值转换为string

  // for example i =10 1) String.valueOf(i);//Now it will return "10" 2 String s=Integer.toString(i);//Now it will return "10" 3) StringBuilder string = string.append(i).toString(); //i = any integer nuber 4) String string = "" + i; 5) StringBuilder string = string.append(i).toString(); 6) String million = String.format("%d", 1000000) 

尝试简单的types转换

 char c = (char) i;