Answers:
正常的方式是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,有一项提议和正在进行的工作来改变这种行为。
"" + 5
变为"5"
)。
"" + 5
而不仅仅是"5"
?
"" + integer
方法在正式的Oracle教程之一中使用。
这是可以接受的,但我从未写过类似的文章。我更喜欢这样:
String strI = Integer.toString(i);
NumberFormatter
是为了什么 您可以使用类似的格式NumberFormat.getInstance(Locale.FRENCH)
。
不仅是优化1。我不喜欢
"" + i
因为它没有表达我真正想做的事情2。
我不想将整数附加到(空)字符串。我想将整数转换为字符串:
Integer.toString(i)
或者,不是我喜欢的,但是比连接更好,它得到对象的字符串表示形式(整数):
String.valueOf(i)
1. 对于经常调用的代码(例如in循环),确保确保优化也是不使用串联的重点。
2. 这对于使用像 或中的真实串联是无效的System.out.println("Index: " + i);
String id = "ID" + i;
大学的许多入门课程似乎都采用这种风格,这有两个原因(以我的经验):
它不需要了解类或方法。通常,这是在没有提到“类”一词的情况下进行的,甚至是方法调用之前都没有讲授。因此,使用类似的东西String.valueOf(…)
会使学生困惑。
这是“运算符重载”的说明–实际上,它是作为惯用的重载运算符出售给我们的(这里难怪,因为Java不允许自定义运算符重载)。
因此,它可能是出于教学上的必要性而诞生的(尽管我会认为这只是不好的教导),或者可能被用来说明一个用Java很难证明的原理。
表达方式
"" + i
导致字符串转换的i
在运行时。表达式的整体类型为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)
String.valueOf
必需的装箱i
(它也不会,因为有接受的重载int
),它也不会使用new Integer(i)
,而是会使用Integer.valueOf(i)
。但这确实没有任何作用。确实new StringBuilder().append("").append(i).toString()
,作为SimonJ的回答笔记。StringBuilder具有用于将原始int i
转换为String 的逻辑。
我知道的另一种方法是从Integer
班级:
Integer.toString(int n);
Integer.toString(int n, int radix);
一个具体的例子(尽管我认为您不需要):
String five = Integer.toString(5); // returns "5"
例如,它也适用于其他原始类型Double.toString
。
十多年前,我在一个大学级别的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。
有多种转换为字符串的方法:
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);
大多数情况与SimonJ相同。我真的不喜欢“ + i”成语。如果您说String.valueOf(i),则Java会将整数转换为字符串并返回结果。如果您说“ + i”,则Java创建一个StringBuilder对象,向其附加一个空字符串,将整数转换为字符串,将该整数附加至StringBuilder,然后将StringBuilder转换为String。这是很多额外的步骤。我想如果您在大型程序中执行一次,那没什么大不了的。但是,如果您一直在执行此操作,则意味着使计算机进行了大量额外的工作,并创建了所有这些额外的对象,然后必须对其进行清理。我不想对微优化感到狂热,但我也不想毫无意义地浪费时间。
String strI = String.valueOf(i);
String string = Integer.toString(i);
两种方法都是正确的。
有很多方法可以将整数转换为字符串:
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)
有三种转换为字符串的方法
String string = "" + i;
String string = String.valueOf(i);
String string = Integer.toString(i);
String.format("%d", i)
。
使用“” + i是将数字转换为字符串的最短,最简单的方法。它不是最有效的,但是它是最清晰的恕我直言,通常更重要。代码越简单,您犯错误的可能性就越小。
""+i
我个人认为,“ +”确实看起来像原始问题发帖人所说的“臭”。除了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美分,是吗?大声笑...
尝试简单的类型转换
char c = (char) i;
char c = (char) (i + 48);