如何从int转换为String?
我正在做一个项目,从int
到String
所有转换都是这样完成的:
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是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 )
就我个人而言,在这段代码中我看不出有什么不好的地方。
当你想logging一个int值时,这个logging器非常有用,并且logging器只接受一个string。 当你需要调用一个接受String的方法时,我会说这样的转换很方便,但是你有一个int值。
至于Integer.toString
或String.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的方法
- String string =“”+ i;
- String string = String.valueOf(i);
- 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;