如何从int转换为String?

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

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

我不熟悉Java。

这是通常的做法还是有什么问题,我想?

2287118 次浏览

这不是一个好方法。

从int到string的转换时,应该使用:

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

我知道的另一种方式来自Integer类:

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

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

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

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

查看这里了解更多细节。

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

String strI = Integer.toString(i);

正常的方法是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。

就个人而言,我在这段代码中看不到任何不好的东西。

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

至于选择Integer.toString还是String.valueOf,这完全是品味的问题。
…在内部,String.valueOf顺便调用Integer.toString方法。:)

的表达

"" + i

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

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

显然,这比调用String.valueOf(new Integer(i))的性能略差,后者将产生相同的结果。

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

(参考:JLS 15.8.1

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

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

"" + i

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

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

Integer.toString(i)

或者,不是我喜欢的,但仍然比连接更好,获取对象(整数)的字符串表示:

String.valueOf(i)

1.对于经常调用的代码,比如在循环中,优化肯定也是不使用连接的一点。

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

这种技术是在我十多年前上的一个本科生水平的Java入门课上教授的。然而,我应该注意的是,IIRC,我们还没有接触到字符串和整数类方法。

该技术输入简单快捷。如果我所做的只是打印一些东西,我会使用它(例如,System.out.println("" + i);。然而,我认为这不是进行转换的最佳方式,因为以这种方式使用它需要思考一下才能意识到发生了什么。此外,如果性能是一个问题,它看起来会更慢(下面更多,以及在其他答案中)。

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

只是为了露齿一笑:)我写了一些类来测试: "" + 、Integer.to字符串和字符串的三种技术。每个测试都只是将整数从1转换为10000。然后我通过Linux时间命令运行了五次。Integer.toString()比String.value()快一点,他们打成三个平手,String.value()快一次;然而,区别从来没有超过几毫秒。

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

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

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

  • 这是“操作符重载”的一个例证——事实上,这是作为惯用重载操作符卖给我们的(这里不足为奇,因为Java不允许自定义操作符重载)。

因此,它可能是出于教学的必要性(尽管我认为这只是糟糕的教学),或者被用来说明一个在Java中很难证明的原则。

使用""+i是将数字转换为字符串的最短和最简单的方法。它不是最有效的,但它是最清晰的IMHO,这通常更重要。代码越简单,出错的可能性就越小。

就我个人而言,我认为“”+i看起来确实像最初的问题海报所说的“臭”。除了Java之外,我还使用了很多OO语言。如果这种语法是合适的,那么Java就可以单独解释i,而不需要根据需要将“”转换为字符串,并且这样做,因为目标类型是明确的,并且只有一个值会在右侧提供。另一个似乎是愚弄编译器的“技巧”,如果需要移植代码,当考虑其他制造商或其他平台制作的不同版本的Javac时,这是一个糟糕的魔力。真见鬼,我的钱,它应该像许多其他OOL的只是采取一个类型转换:(字符串)i.眨眼

鉴于我的学习方式以及在快速阅读他人代码时易于理解这种结构,我投票支持Integer.toString(i)方法。忘记Java如何在后台实现事物与String.valueOf(i)这个方法对我来说感觉正确,并准确地说明了正在发生的事情:我有和整数,我希望它转换为字符串。

几次提出的一个很好的观点也许只是在前面使用StringBuilder是构建混合文本和整数或其他对象的字符串的一个很好的答案,因为这就是在后台使用的东西,对吧?

只是我的两分钱扔进了已经高薪的小猫对Mans问题的答案…微笑

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

好吧,好吧,我一直在思考这个问题String.valueOf(i)也非常好,它说:我想要一个代表整数值的字符串。哈哈,到目前为止,英语比Java更难解析!但是,我留下了我剩下的答案/评论……我总是被教导使用方法/函数链的最低级别,如果可能的话,仍然保持可读性,所以如果String.value调用Integer.to字符串,那么如果你无论如何都要剥掉它,为什么要使用整个橘子呢,嗯?

为了澄清我对StringBuilder的评论,我用大部分文字文本和int的组合构建了很多字符串,它们最终变得又长又丑,调用嵌入在+之间的上述例程,所以在我看来,如果这些成为SB对象,并且append方法已经过载,那么继续使用它可能会更干净……所以我想我现在最多5美分了,嗯?哈哈……

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

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

这取决于您想如何使用String。这可以帮助:

String total =  Integer.toString(123) + Double.toString(456.789);

尝试简单的类型转换

char c = (char) i;

有几种方法可以转换为String:

StringBuilder string = string.append(i).toString();
String string = String.valueOf(i);
String string = Integer.toString(i);
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)

使用Integer.toString(tmpInt).trim();

正如已经指出的那样,Integer.toString()String.valueOf()是可行的方法。我很好奇,做了一个快速基准测试:

Integer.toString(i)String.valueOf(i)在性能上基本相同,Integer.toString(i)稍微快一点。然而i + ""慢1.7倍。

import java.util.Random;


public class Test {


public static void main(String[] args) {
long concat = 0;
long valueOf = 0;
long toString = 0;
        

int iterations = 10000;
int runs = 1000;
for(int i = 0; i < runs; i++) {
concat += concat(iterations);
valueOf += valueOf(iterations);
toString += to_String(iterations);
}
        

System.out.println("concat: " + concat/runs);
System.out.println("valueOf: " + valueOf/runs);
System.out.println("toString: " + toString/runs);
}
    

public static long concat(int iterations) {
Random r = new Random(0);
long start = System.nanoTime();
for(int i = 0; i < iterations; i++) {
String s = r.nextInt() + "";
}
return System.nanoTime() - start;
}
    

public static long valueOf(int iterations) {
Random r = new Random(0);
long start = System.nanoTime();
for(int i = 0; i < iterations; i++) {
String s = String.valueOf(r.nextInt());
}
return System.nanoTime() - start;
}
    

public static long to_String(int iterations) {
Random r = new Random(0);
long start = System.nanoTime();
for(int i = 0; i < iterations; i++) {
String s = Integer.toString(r.nextInt());
}
return System.nanoTime() - start;
}
}

输出:

concat: 1004109
valueOf: 590978
toString: 587236