gpt4 book ai didi

Java 类型转换。 (String)、.toString() 和 ""+ int 背后的逻辑

转载 作者:行者123 更新时间:2023-12-02 09:43:14 24 4
gpt4 key购买 nike

Java 是一种强类型语言。因此,编译代码中的错误更少,可读性更好,但代价是编码速度较慢。因此,需要显式类型转换,这部分很清楚。

这些片段之间有什么区别:

(String)myInt // obviously doesn't compile
Integer.toString(myInt)
"" + myInt

这纯粹是历史原因,还是有什么深意?
哪种方法合适?

最佳答案

正如之前提到的,(String) myInt 是一个类型转换。在 Java 中,我们可以在基元内进行强制转换,也可以在对象层次结构中向上强制转换。由于 int 是一个基元,而 String 是一个对象,所以我们遇到了问题。偶Autoboxing无法解决这个困境,因为 IntegerString 不存在继承关系。因此,(String) myInt 完全有可能导致编译错误。

Integer.toString(myInt)""+ myInt 的语义是相同的。但具体情况有所不同。

执行Integer.toString(myInt)时,会构造一个新的String,其中包含myInt的字符串表示形式。

当执行""+ myInt时,Java首先构造一个全局String常量,其值为""(这是通过在 JVM 中,我们看不到这个1)。词法分析器要求 + 右侧有一个 String,因为它在 + 左侧发现了一个 String 。对于原语,JVM“知道”如何将它们转换为String。对于对象,调用toString()。由于 Object 具有此方法,并且每个类(至少隐式)派生自 Object,因此保证每个对象都有一个 toString() 方法。这是构造的第二个String。自 Strings are immutable ,JVM 可能会创建第三个 String,表示前两个 Strings2 的串联。

<小时/>

结语

然后,在执行时,JIT 编译器启动,其中大部分可能无关紧要,因为两种变体的 JIT 优化版本可能看起来相同。或不。或者也许只是有时。 JIT 做一些有趣的事情。所以最终这更多的是个人风格的问题而不是表现的问题:)

<小时/>

1这实际上是一个谎言。写的时候

String s1 = "";
String s2 = "";
System.out.println(s1 == s2);

人们会观察到结果是true,而false是预期的。这是因为 JVM 为所有 String 常量创建了一个池以节省一些内存。

2 JVM 很可能“识别”到 something + ""== ""+ some == Something,因此不会创建第三个 字符串。我没有对此进行测试或研究。

关于Java 类型转换。 (String)、.toString() 和 ""+ int 背后的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37328875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com