Java字符串文字自动解释为String对象,但如何?

时间:2011-03-24 04:36:41

标签: java string jvm

Java自动将字符串文字解释为String对象的机制是什么,因为没有重载运算符,并且没有对低级字符串缓冲区(不包括高级StringBuffer)的默认支持?这是语言或虚拟机上下文吗?

3 个答案:

答案 0 :(得分:6)

这两者都有。

JVM具有用于将字符串文字加载到运行时堆栈上的字节代码,并且这些操作码在JVM规范中指定,通过将适当构造的String对象推送到其内容等于在其中指定的某个字符串文字的堆栈来工作。类文件。除了必须实现String对象之外,没有关于如何完成此操作的规范,这意味着转换是特定于实现的。

在语言级别,编译器可以将它看到的任何String文字视为完整的String对象,以便进行类型检查,然后只需将文字和适当的字节码写入类文件即可。

答案 1 :(得分:3)

Java确实有一些重载运算符。例如,+可以应用于String对象以及int,float和其他数字类型。在每种情况下,返回类型由+每一侧的表达式类型定义。但是,所有重载的运算符都是用语言预定义的;程序员没有语言机制来定义任何其他语言。有关详细信息,请参阅language specification

答案 2 :(得分:0)

编译器基本上会重写代码。

String x = "Some String";

对于串联,它只是StringBuffer追加方法的语法糖,即:

z += " with some more in it";

编译为:

z = new StringBuffer(z).append(" with some more in it").toString();

现在对于单个concat,这是一个创建的对象和2个方法调用,所以如果你在循环中构建一个非常长的字符串,那么编写它会更有效:

StringBuilder buf = new StringBuilder(); // Not synchronized so quicker than StringBuffer
while ( condition is true )
    buf.append(...);
String z = buf.toString();

而不是:

String z = "";
while (condition is true)
   z += "...";

编辑:删除了错误的代码示例...