Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串文本自动解释为字符串对象,但如何解释?_Java_String_Jvm - Fatal编程技术网

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

Java字符串文本自动解释为字符串对象,但如何解释?,java,string,jvm,Java,String,Jvm,Java自动将字符串文本解释为字符串对象背后的机制是什么,因为没有重载运算符,也没有对低级字符串缓冲区(不包括高级StringBuffer)的默认支持?这是一种语言还是虚拟机上下文?两者兼而有之 JVM具有将字符串文本加载到运行时堆栈的字节码,这些操作码在JVM规范中指定,通过将适当构造的字符串对象推送到堆栈上,其内容等于类文件中指定的某个字符串文本来工作。除了String对象必须是interned之外,没有关于如何实现的规范,这意味着转换是特定于实现的 在语言级别上,为了进行类型检查,编译器可

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

两者兼而有之

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


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

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

基本上编译器会重写您的代码

String x = "Some String";
对于串联,它只是StringBuffer append方法的语法糖,即:

z += " with some more in it";
汇编如下:

z = new StringBuffer(z).append(" with some more in it").toString();
现在,对于单个concat,这是一个创建的对象和两个方法调用,因此,如果您在循环中构建一个很长的字符串,那么编写以下内容的效率要高得多:

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 += "...";

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

作为学习练习,有没有办法用Java字节码(类似于某种汇编语言)编写程序?是的,有Java汇编程序可用。。。茉莉就是其中之一。您还可以使用BCEF在运行时或修改时从字节码动态创建类classes@Aaron:我相信你的意思是BCEL;但这是老生常谈。动态创建字节码的现代方法是使用。有没有办法调用内存缓冲区上的类加载器(即在运行时从字节码创建的类)*你不必说得太具体,我现在对它的想法太感兴趣了是的,绝对。。。我认为ClassLoader有一个名为defineClass的方法来实现这一点。Java不是很棒吗?不,
“我是字符串”
不是
新字符串(“我是字符串”)
;如果是这样,您将得到对
String
构造函数的无限递归调用!一个小细节-所有字符串文字都是内部的,因此字符串文字与生成新字符串并不完全相同。它将返回所有具有相同值的字符串文本共享的字符串实例。@templatetypedef:实际上,这是一个重要的细节。我有时会编写利用该属性的代码:例如,如果我知道我正在比较两个变量,而我知道这两个变量是字符串文本或其他内部变量,我会使用标识比较。@Chris:你能提供一个例子来说明这一点吗?@bguiz:一个例子是我们(在工作中)必须内部所有设置名称(因为否则,它会使堆的使用量毫无理由地激增)。一旦做出了这个决定,就可以使用标识比较来比较所有的设置名称。(实习和比较完全隐藏在私有方法后面,因此调用代码不必关心这些实现细节。)对不起,不是我。我被否决了,因为我建议某人暂停并恢复一个线程,而不是破坏它并创建新的线程实例,没有人来解释原因。@Turtleteos:我写了一条评论解释为什么你的答案很糟糕(但我不是否决你的人;也许他们会展示自己,或者不会)是的,我从中得到了一个笑声,谢谢:p但至少我的推理是正确的;也许不是因为具体的背景,而是一般的