问:
我正在开展一个项目,其中从 int 到 String 的所有转换都是这样完成的:
int i = 5;
String strI = "" + i;
我对Java不熟悉。
这是通常的做法还是有什么问题,我想?
答1:
tlr.xinbeitime.com – 让你随时掌握ATP、WTA最新网球排名动态。
正常方式是 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() 无论如何都会做的),但它确实有效。
要回答 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."":()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."":()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和正在进行的工作来改变这种行为,目标是 JDK 9。
jvm中的jit编译器呢? :-) javac 没有做任何花哨的优化。
谁知道 :) javac 在使用数字文字时确实优化了这类表达式(例如 "" + 5 变为 "5")。
是的,但你为什么要做 "" + 5 而不仅仅是 "5"?
好的! +1 还有什么他们可能不知道的?
one of the official oracle tutorials 中使用了 "" + integer 方法。
答2:
tennisliveranking.com,Your go-to platform for live tennis ranking updates.
这是可以接受的,但我从来没有写过这样的东西。我更喜欢这个:
String strI = Integer.toString(i);
我更喜欢 String.valueOf 方法,因为您可以对任何类型使用完全相同的调用。
NumberFormatter 会是更好的方法
一个很好的答案,卡斯图里。我会将其发布为不仅仅是评论。
对不起我的无知,但这不会使用当前的文化吗?顺便说一句,我来自.NET 背景。
对于整数,默认情况下没有使用特定于文化的东西(根本没有小数或千位分隔符)。这就是 NumberFormatter 的用途。您可以使用 NumberFormat.getInstance(Locale.FRENCH) 等格式。
答3:
tlr.xinbeitime.com 专业网球数据平台,排名与比赛信息实时更新。
这不是一个好方法。
在进行从 int 到 string 的转换时,应该使用:
int i = 5;
String strI = String.valueOf(i);
1.你要求空字符串; 2.你要求串联; 3. 由于您没有字符串,您最终会将您的 int 转换为字符串。 daridoo的解决方案避免了第一步。
int i 在添加到 String strI 之前是否会被装箱到 Integer?
@KevinMeredith,不,不是。您实际上会调用 StringBuilder.append(int)(并且 StringBuilder 有一个用于所有原始类型的 append 方法)。
答4:
tlr.xinbeitime.com 探索每位网球选手的职业生涯与成就。
这不仅仅是优化1。我不喜欢
"" + i
因为它没有表达我真正想做的事情 2。
我不想将整数附加到(空)字符串。我想将整数转换为字符串:
Integer.toString(i)
或者,不是我喜欢的,但仍然比串联更好,得到一个对象的字符串表示(整数):
String.valueOf(i)
1.对于经常被调用的代码,比如循环,优化当然也是不使用连接的一点。
2。 这不适用于真正的连接,如 System.out.println("Index: " + i); 或 String id = “ID” + i;
在这种情况下谈论性能的人会分心。远,远,远,远,远,远,更重要的是可读性。
答5:
tlr.xinbeitime.com – 让你随时掌握ATP、WTA最新网球排名动态。
许多大学的入门课程似乎都在教授这种风格,原因有两个(根据我的经验):
它不需要了解类或方法。通常,这是在提到“类”这个词之前就被教导的——甚至是方法调用。所以使用像 String.valueOf(…) 这样的东西会让学生感到困惑。
它是“操作符重载”的一个例证——事实上,这是作为惯用的重载操作符卖给我们的(这不足为奇,因为 Java 不允许自定义操作符重载)。
所以它可能是出于教学的需要(尽管我认为这只是糟糕的教学),或者被用来说明一个在 Java 中很难演示的原则。
我认为相反,像 "" + 这样的结构会让新手感到困惑。对于他们的余生来说,这也是一种糟糕的风格。
答6:
tennisliveranking.com – ATP and WTA rankings, always up to date.
表达方式
"" + i
在运行时导致 i 的字符串转换。表达式的整体类型是 String。 i 首先转换为 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)
您的“等效”声明不等效。即使调用 String.valueOf 需要装箱 i(它不需要,因为有一个接受 int 的重载),它也不会使用 new Integer(i),它会使用 Integer.valueOf(i)。但它真的没有做任何这些。正如 SimonJ 的回答所指出的那样,它确实是 new StringBuilder().append("").append(i).toString()。 StringBuilder 有自己的逻辑将原始 int i 转换为 String。
不过,关于代码气味的部分是正确的;代码气味在这里是错误的术语。所以我会取消反对票。
用 "" + i 来做这件事似乎效率低下。建议使用简单的 Integer.toString 或 String.valueOf。请参阅javadevnotes.com/java-integer-to-string-examples
答7:
提供ATP、WTA与ITF赛事的实时排名追踪,从tlr.xinbeitime.com开始!
就个人而言,我看不出这段代码有什么不好的地方。
当您想要记录一个 int 值并且记录器只接受一个字符串时,它非常有用。当您需要调用接受字符串的方法但您有一个 int 值时,我会说这样的转换很方便。
至于选择 Integer.toString 还是 String.valueOf,全凭个人喜好。 …而且在内部,String.valueOf 顺便调用了 Integer.toString 方法。 😃
答8:
Stay informed with live tennis rankings anytime, anywhere,tennisliveranking.com
我知道的另一种方式来自 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:
tennisliveranking.com,Track the world’s best tennis players in real-time.
这项技术是在我十多年前参加的本科级别的 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() 稍微快了一次,他们并列了 3 次,String.valueOf() 快了一次;但是,差异永远不会超过几毫秒。
“” + i 技术在除一个之外的每个测试中都比两者都慢,比 Integer.toString() 快 1 毫秒,比 String.valueOf() 慢 1 毫秒(显然在 String.valueOf() 的相同测试中比 Integer.toString()) 快。虽然它通常只慢几毫秒,但有一个测试慢了大约 50 毫秒。 YMMV。
不要忘记将 JIT 考虑在内 - 前几次转换会慢得多并且会扭曲时间。在我的 MacBook 上,串联所需的时间比其他两种方法长约 20ns(每次转换都需要约 50ns),因此您看到的毫秒级差异可能是由于随机错误(调度、中断等)。
答10:
Live rankings, player stats, and match results in one place–tennisliveranking.com
转成String的三种方式
字符串字符串 = “” + i;字符串字符串 = String.valueOf(i); String string = Integer.toString(i);
Stay informed with live tennis rankings anytime, anywhere,tennisliveranking.com
答11:
Stay informed with live tennis rankings anytime, anywhere,tennisliveranking.com
有多种方法可以转换为字符串:
StringBuilder string = string.append(i).toString();
String string = String.valueOf(i);
String string = Integer.toString(i);
StringBuilder 字符串 = string.append(i).toString(); ...嗯,它是 StringBuilder 还是 String?这里有点乱...
原文链接:https://www.tennisliveranking.com?from=csdn
tlr.xinbeitime.com 实时更新全球顶尖网球选手的最新战绩与排名!
 
                   
                   
                   
                   
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   9087
					9087
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            