代码之家  ›  专栏  ›  技术社区  ›  Denis Palnitsky

如何从int转换为String?

  •  712
  • Denis Palnitsky  · 技术社区  · 14 年前

    我在做一个项目 int String 是这样做的:

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

    19 回复  |  直到 8 年前
        1
  •  950
  •   Peter Mortensen Josh McGee    8 年前

    正常的方式是 Integer.toString(i) String.valueOf(i) .

    连接可以工作,但它是非常规的,可能是一种难闻的气味,因为它表明作者不知道上述两种方法(还有什么他们可能不知道?).

    Java在与字符串一起使用时对+运算符有特殊支持(请参见 the documentation

    StringBuilder sb = new StringBuilder();
    sb.append("");
    sb.append(i);
    String strI = sb.toString();
    

    在编译时。效率有点低( sb.append() Integer.getChars() ,这就是 Integer.toString()

    回答格罗德里格斯的评论:**不,编译器 在这种情况下优化空字符串-看:

    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
    }
    

    a proposal 以及针对JDK9正在进行的改变这种行为的工作。

        2
  •  251
  •   duffymo    14 年前

    可以接受,但我从未写过那样的东西。我更喜欢这个:

    String strI = Integer.toString(i);
    
        3
  •  111
  •   darioo    14 年前

    从int转换为string时,应使用以下命令:

    int i = 5;
    String strI = String.valueOf(i);
    
        4
  •  59
  •   user85421    6 年前

    不仅仅是优化 1个 . 我不喜欢

    "" + i
    

    2个 .

    Integer.toString(i)
    

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

    String.valueOf(i)
    

    一。 .

    2。 这对使用 真实的 类似于in的连接 System.out.println("Index: " + i); String id = "ID" + i;

        5
  •  23
  •   Konrad Rudolph    14 年前

    很多大学的入门课程似乎都采用这种方式,原因有二(以我的经验):

    • 它不需要理解类或方法。通常,这是在没有提到类这个词,甚至没有调用方法之前教的。所以用一些像 String.valueOf(…) 会迷惑学生。

    • 这是操作员超载的一个例子事实上,这是卖给我们的 这个

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

        6
  •  16
  •   Andreas Dolk    14 年前

    表达

    "" + i
    

    导致 字符串转换 属于 i String . Integer 对象( new Integer(i) ),然后 String.valueOf(Object obj) 被称为。所以它相当于

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

    很明显,这比打电话来的性能稍差 String.valueOf(new Integer(i)) 会产生同样的结果。

    优势 ""+i 是打字更容易/更快,有些人可能会认为,它更容易阅读。它不是 code smell 因为这并不意味着任何更深层次的问题。

    (参考文献: JLS 15.8.1

        7
  •  14
  •   Franta 10yei    6 年前

    就我个人而言,我认为这段代码没有什么不好的地方。

    至于选择 Integer.toString String.valueOf ,都是口味的问题。
    …在内部 打电话给 整数.toString 顺便说一句。:)

        8
  •  12
  •   zneak    14 年前

    Integer 班级:

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

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

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

    See here for more details.

        9
  •  9
  •   Peter Mortensen Josh McGee    8 年前

    这项技术是在我十多年前参加的Java课程的本科入门课程中教授的。但是,我应该注意到,IIRC,我们还没有得到String和Integer类方法。

    这项技术简单,打字速度快。如果我只是打印一些东西,我会用它(例如, System.out.println("" + i);

    就我个人而言,我更喜欢Integer.toString(),因为很明显发生了什么。String.valueOf()是我的第二个选择,因为它看起来很混乱(看看darioo回答之后的评论)。

    我写了一些类来测试三种技术:“+I、Integer.to String和String.ValueOf。每次测试都将int从1转换为10000。然后我在Linux中运行每一个 time

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

        10
  •  6
  •   Shailej Shimpi    9 年前

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

    StringBuilder string = string.append(i).toString();
    String string = String.valueOf(i);
    String string = Integer.toString(i);
    
        11
  •  6
  •   Sнаđошƒаӽ Marco Tedone    8 年前

    String total =  Integer.toString(123) + Double.toString(456.789);
    
        12
  •  5
  •   Paul Rooney    7 年前
    String strI = String.valueOf(i);
    
    String string = Integer.toString(i);
    

    两种方法都是正确的。

        13
  •  5
  •   Peter Mortensen Josh McGee    7 年前

    有多种方法可以将整数转换为字符串:

    (一)

    Integer.toString(10);
    

    2个)

     String hundred = String.valueOf(100); // You can pass an int constant
     int ten = 10;
     String ten = String.valueOf(ten)
    

    三)

    String thousand = "" + 1000; // String concatenation
    

    (四)

    String million = String.format("%d", 1000000)
    
        14
  •  5
  •   Suresh Maidaragi    6 年前

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

    1. String string = "" + i;
    2. String string = String.valueOf(i);
    3. String string = Integer.toString(i);
        15
  •  4
  •   Jay    14 年前

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

        16
  •  3
  •   Peter Lawrey    14 年前

        17
  •  2
  •   David    11 年前

    就我个人而言,我认为“+我看起来确实像最初的问题海报上说的“臭”。除了Java,我还使用了很多OO语言。如果该语法是合适的,那么Java只需解释i,而不需要将“”转换为字符串,并执行此操作,因为目标类型是明确的,并且右侧只提供一个值。另一个看起来像是欺骗编译器的“伎俩”,当其他制造商或其他平台生产的不同版本的Javac被考虑到需要移植代码时,这是一个糟糕的诀窍。见鬼,我的钱,它应该像许多其他工具只是采取一个类型转换:(字符串)我。 眨眼

    考虑到我的学习方式和在快速阅读其他代码时理解这种结构的方便性,我投票支持Integer.toString(I)方法。忘记了Java在后台实现的方式和String.valueOf(i)这个方法对我来说是正确的,它准确地说明了正在发生的事情:我有和Integer,我希望它转换成一个字符串。

    一个好的观点是,在前面使用StringBuilder可能是一个很好的解决方案,可以构建混合了文本和int或其他对象的字符串,因为这将在后台使用,对吧?

    只是我的两分钱花在了已经很有钱的男人问题的答案里。。。

    经过深思熟虑,编辑成我自己的答案:

    好吧,好吧,我在考虑这个问题,还有String,value of(I)也很好,它说:我想要一个表示整数值的字符串。哈哈,英语比Java更难解析!但是,我留下我的回答/评论。。。我总是被教导尽可能使用方法/函数链的最低级别,并且仍然保持可读性,所以如果String.valueOf调用Integer.toString,那么如果你想剥掉它的皮,为什么要使用整个橙色,嗯?

    为了澄清我对StringBuilder的评论,我构建了很多字符串,其中大部分是文本和int的组合,它们最后变得又长又难看,上面提到的例程的调用被嵌入到了+之间,所以在我看来,如果这些对象变成了SB对象,而append方法有重载,那么继续使用它可能会更干净它。。。所以我想我现在要花5美分了,嗯?大声笑。。。

        18
  •  -1
  •   Karan Chunara    6 年前

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

        19
  •  -5
  •   ΦXocę 웃 Пepeúpa ツ    8 年前

    尝试简单的排版

    char c = (char) i;