Java自动将字符串文字解释为String对象的机制是什么,因为没有重载运算符,并且没有对低级字符串缓冲区(不包括高级StringBuffer)的默认支持?这是语言或虚拟机上下文吗?
答案 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 += "...";
编辑:删除了错误的代码示例...