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

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

我不熟悉Java。

这是惯例吗,还是像我猜想的那样,出了什么问题?


当前回答

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

String strI = Integer.toString(i);

其他回答

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

String strI = Integer.toString(i);

Personally I think that "" + i does look as the original question poster states "smelly". I have used a lot of OO languages besides Java. If that syntax was intended to be appropriate then Java would just interpret the i alone without needing the "" as desired to be converted to a string and do it since the destination type is unambiguous and only a single value would be being supplied on the right. The other seems like a 'trick" to fool the compiler, bad mojo when different versions of Javac made by other manufacturers or from other platforms are considered if the code ever needs to be ported. Heck for my money it should like many other OOL's just take a Typecast: (String) i. winks

考虑到我的学习方式以及在快速阅读其他代码时易于理解这样的结构,我投票给Integer.toString(I)方法。忘记一个ns或两个在Java如何实现的东西在后台vs. String. valueof (i)这个方法感觉对我来说是正确的,并确切地说正在发生什么:我有一个整数,我希望它转换为字符串。

有一个很好的观点已经说过几次了,也许只是在前面使用StringBuilder是一个很好的答案,构建混合文本和int或其他对象的字符串,因为这将在后台使用,对吗?

我只是把我的两分钱投到曼斯问题的答案中……微笑

经过思考后,编辑成我自己的答案:

好的,好的,我在思考这个问题,String. valueof (I)也很好,它说:我想要一个表示整数值的字符串。哈哈,英语比Java更难解析!但是,我留下我其余的答案/评论…我总是被教导使用方法/函数链的最低级别,如果可能的话,仍然保持可读性,所以如果字符串。valueOf调用Integer。那么为什么要用整个橙子,如果你只是要剥它,嗯?

为了澄清我对StringBuilder的评论,我用文字文本和int's的组合构建了很多字符串,它们最终变得又长又丑,调用了上面提到的嵌入在+'s之间的例程,所以在我看来,如果这些成为SB对象,无论如何,append方法有重载,它可能会更干净,只是继续使用它…所以我想我现在在这件事上要花5美分了,是吗?哈哈

正常的方法是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()本来要做的),但它是有效的。

回答grorodriguez的评论:**不,编译器在这种情况下不会优化空字符串-看:

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,有一个改变这种行为的提议和正在进行的工作。

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

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

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

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

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

它也适用于其他基本类型,例如Double.toString。

请看这里了解更多细节。