我工作的地方所有转换项目int来String都是这样完成的:
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的改进此行为的提案和正在进行的工作.
duf*_*ymo 248
这是可以接受的,但我从来没有写过这样的东西.我更喜欢这个:
String strI = Integer.toString(i);
Run Code Online (Sandbox Code Playgroud)
dar*_*ioo 109
这不是一个好方法.
在从int转换为string时,应该使用:
int i = 5;
String strI = String.valueOf(i);
Run Code Online (Sandbox Code Playgroud)
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;
Kon*_*lph 23
许多入门大学课程似乎都教这种风格,原因有二(根据我的经验):
它不需要理解类或方法.通常,这是在提到"class"这个词之前教授的方式 - 甚至也不是方法调用.所以使用类似的东西String.valueOf(…)会让学生感到困惑.
它是"运算符重载"的一个例子 - 实际上,这是作为惯用的重载运算符出售给我们的(这里很奇怪,因为Java不允许自定义运算符重载).
因此它可能是出于教学必要性而产生的(尽管我认为这只是一种糟糕的教学方式),或者用来说明一种原则,否则在Java中很难证明.
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)
小智 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.
这种技术是在十年前的一个本科水平的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)
主要是在 SimonJ 上同上。我真的不喜欢 ""+i 成语。如果您说 String.valueOf(i),Java 会将整数转换为字符串并返回结果。如果您说 ""+i,Java 将创建一个 StringBuilder 对象,向其附加一个空字符串,将整数转换为字符串,将其附加到 StringBuilder,然后将 StringBuilder 转换为 String。这是很多额外的步骤。我想如果你在一个大程序中做一次,那没什么大不了的。但是如果你一直这样做,你就会让计算机做一堆额外的工作,并创建所有这些额外的对象,然后必须清理它们。我不想狂热于微优化,但我也不想毫无意义地浪费。
有三种转换为字符串的方法
String string = "" + i;String string = String.valueOf(i);String string = Integer.toString(i);小智 5
String strI = String.valueOf(i);
String string = Integer.toString(i);
Run Code Online (Sandbox Code Playgroud)
这两种方式都是正确的.
有很多种方法可以将整数转换为字符串:
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)
| 归档时间: |
|
| 查看次数: |
2224967 次 |
| 最近记录: |