Ste*_*pan 2 java string casting tostring
Java是一种强类型语言.因此,编译代码中的错误更少,编码速度更慢,可读性更高.因此,需要显式类型转换,这部分是清楚的.
这些片段之间有什么区别:
(String)myInt // obviously doesn't compile
Integer.toString(myInt)
"" + myInt
Run Code Online (Sandbox Code Playgroud)
这纯粹是出于历史原因,还是背后有一些意义?
哪种方法合适?
如前所述,(String) myInt是一种类型转换.您可以在对象层次中在基元内或向上投射.既然int是原始的并且String是对象,我们就有问题.即使是自动装箱无法解决,因为这一难题Integer,并String在继承的关系,不站.因此,(String) myInt导致编译错误是完全合理的.
语义Integer.toString(myInt)和"" + myInt完全相同.然而,细节是不同的.
执行时Integer.toString(myInt),String构造一个new ,其中包含一个String表示形式myInt.
执行时"" + myInt,首先构造一个String具有该值的全局常量""(这是由JVM完成的,您没有看到这个1).词法分析器要求String在右侧,+因为它找到了String左侧的一个+.对于原语,JVM"知道"如何将它们转换为Strings.对于对象,toString()被称为.由于Object此方法和每个类(至少是隐式)派生自Object,因此每个对象都保证有一个toString()方法.这是第二个String构建的.由于Strings是不可变的,JVM可能会创建第三个String,表示前两个Strings 2的串联.
结语:
然后,在执行时,JIT编译器会发生冲击,而且大多数情况可能都是无关紧要的,因为两种变体的JIT优化版本可能看起来相同.或不.或者可能只是有时候.JIT做有趣的事情.所以最后它更多的是个人风格而不是表现:)
1这实际上是一个谎言.写作时
String s1 = "";
String s2 = "";
System.out.println(s1 == s2);
Run Code Online (Sandbox Code Playgroud)
人们会观察到结果是true,而false预期.这是因为JVM为所有String常量创建了一个池以节省一些内存.
2 JVM很可能"识别"它something + "" == "" + something == something,因此不会创建第三个String.我既没有测试也没有研究过这个.
| 归档时间: |
|
| 查看次数: |
886 次 |
| 最近记录: |