繁体   English   中英

如何从 int 转换为 String?

[英]How do I convert from int to String?

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

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

我不熟悉Java。

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

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

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

String strI = Integer.toString(i);

这不是一个好方法。

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

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

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

"" + i

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

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

Integer.toString(i)

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

String.valueOf(i)

1.对于经常调用的代码,比如在循环中,优化当然也是不使用 concatenation 的一个要点

2.这不适用于System.out.println("Index: " + i);实际连接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

就我个人而言,我在这段代码中没有看到任何不好的地方。

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

至于在Integer.toStringString.valueOf之间进行选择,这完全是一个品味问题。
...在内部, String.valueOf顺便调用了Integer.toString方法。 :)

我知道的另一种方式是从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时间命令分别运行了五次。 Integer.toString() 比 String.valueOf() 稍快一次,他们并列了 3 次,String.valueOf() 快了一次; 然而,差异从未超过几毫秒。

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

这取决于您想如何使用您的字符串。 这可以帮助:

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

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

StringBuilder string = string.append(i).toString();
String string = String.valueOf(i);
String string = Integer.toString(i);

转换为字符串的三种方式

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

String string = Integer.toString(i);

两种方式都是正确的。

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

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

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)

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

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

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

几次提出的一个好观点可能只是预先使用 StringBuilder 是构建混合文本和整数或其他对象的字符串的一个很好的答案,因为那无论如何都将在后台使用,对吗?

只是我的两分钱投入到已经得到很好报酬的小猫中,回答了 Mans 问题......微笑

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

好的,好的,我在考虑更多并且 String.valueOf(i) 也非常好,它说:我想要一个代表整数值的字符串。 大声笑,英语比 Java 更难解析! 但是,我留下其余的答案/评论......我总是被教导尽可能使用方法/函数链的最低级别,并且仍然保持可读性,所以如果 String.valueOf 调用 Integer.toString 那么为什么使用整个橙色如果你只是要剥皮,嗯?

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

正如已经指出的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

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

尝试简单的类型转换

char c = (char) i;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM