JDK 9 / JEP 280:字符串串联永远不会相同

JEP 280 (“ Indify String Concatenation”)是与JDK 9结合实现的,根据其“摘要”部分,“更改了javac生成的静态String -concatenation字节码序列,以使用对JDK库函数的invokedynamic调用。 ” 通过查看在JDK 9之前和JDK 9之后的JDK中编译的使用字符串连接的类的javap输出,最容易看出这对Java中的字符串连接的影响。

以下名为“ HelloWorldStringConcat”的简单Java类将用于首次演示。

package dustin.examples;import static java.lang.System.out;public class HelloWorldStringConcat
{public static void main(final String[] arguments){out.println("Hello, " + arguments[0]);}
}

接下来显示的是使用JDK 8( AdoptOpenJDK )和JDK 11( Oracle OpenJDK )编译时, HelloWorldStringConcat类的main(String)方法从javap输出的-verbose输出的差异。 我强调了一些关键差异。

JDK 8 javap输出

Classfile /C:/java/examples/helloWorld/classes/dustin/examples/HelloWorldStringConcat.classLast modified Jan 28, 2019; size 625 bytesMD5 checksum 3e270bafc795b47dbc2d42a41c8956afCompiled from "HelloWorldStringConcat.java"
public class dustin.examples.HelloWorldStringConcatminor version: 0major version: 52. . .public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=4, locals=1, args_size=10: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;3: new           #3                  // class java/lang/StringBuilder6: dup7: invokespecial #4                  // Method java/lang/StringBuilder."":()V10: ldc           #5                  // String Hello,12: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;15: aload_016: iconst_017: aaload18: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;21: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;24: invokevirtual #8                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V27: return

JDK 11 javap输出

Classfile /C:/java/examples/helloWorld/classes/dustin/examples/HelloWorldStringConcat.classLast modified Jan 28, 2019; size 908 bytesMD5 checksum 0e20fe09f6967ba96124abca10d3e36dCompiled from "HelloWorldStringConcat.java"
public class dustin.examples.HelloWorldStringConcatminor version: 0major version: 55. . .public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: (0x0009) ACC_PUBLIC, ACC_STATICCode:stack=3, locals=1, args_size=10: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;3: aload_04: iconst_05: aaload6: invokedynamic #3,  0              // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String;11: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V14: return

JEP 280的“描述”部分描述了这种区别:“其思想是用对java.lang.invoke.StringConcatFactory的简单invokedynamic调用来替换整个StringBuilder附加舞蹈,该调用将接受需要串联的值。” 同一部分显示了类似字符串连接示例的编译输出的相似比较。

JDK 11中用于简单字符串连接的编译输出不仅比其JDK 8对应的行少,而且还包含更多行。 它还具有较少的“昂贵”操作。 不需要包装原始类型,也不需要实例化大量额外的对象,就可以获得潜在的性能改进。 进行此更改的主要动机之一是“为构建优化的String串联处理程序打下基础,无需更改Java到字节码编译器即可实现”,并“无需进一步更改String串联即可启用将来的优化。 javac发出的字节码。”

JEP 280不影响StringBuilderStringBuffer

有这样的使用方面一个有趣的暗示的StringBuffer (这我有困难的时候找到反正很好用 )和StringBuilder的 。 JEP 280被声明为“非目标”, 不要 “引入任何可能有助于构建更好的翻译策略的新的String和/或StringBuilder API”。 与此相关的是,对于简单的字符串连接(如本文开头的代码示例所示),显式使用StringBuilderStringBuffer实际上将使编译器无法利用本文中讨论的JEP 280引入的功能。 。

接下来的两个代码清单显示了与上面显示的简单应用程序相似的实现,但是它们分别使用StringBuilderStringBuffer代替字符串串联。 当使用JDK 8和JDK 11编译这些类后,对这些类执行javap -verbose时, main(String[])方法之间没有显着差异。

JDK 8和JDK 11中的显式StringBuilder使用相同

package dustin.examples;import static java.lang.System.out;public class HelloWorldStringBuilder
{public static void main(final String[] arguments){out.println(new StringBuilder().append("Hello, ").append(arguments[0]).toString());}
}

HelloWorldStringBuilder.main(String[]) JDK 8 javap输出

Classfile /C:/java/examples/helloWorld/classes/dustin/examples/HelloWorldStringBuilder.classLast modified Jan 28, 2019; size 627 bytesMD5 checksum e7acc3bf0ff5220ba5142aed7a34070fCompiled from "HelloWorldStringBuilder.java"
public class dustin.examples.HelloWorldStringBuilderminor version: 0major version: 52. . .public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=4, locals=1, args_size=10: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;3: new           #3                  // class java/lang/StringBuilder6: dup7: invokespecial #4                  // Method java/lang/StringBuilder."":()V10: ldc           #5                  // String Hello,12: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;15: aload_016: iconst_017: aaload18: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;21: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;24: invokevirtual #8                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V27: return

HelloWorldStringBuilder.main(String[]) JDK 11 javap输出

Classfile /C:/java/examples/helloWorld/classes/dustin/examples/HelloWorldStringBuilder.classLast modified Jan 28, 2019; size 627 bytesMD5 checksum d04ee3735ce98eb6237885fac86620b4Compiled from "HelloWorldStringBuilder.java"
public class dustin.examples.HelloWorldStringBuilderminor version: 0major version: 55. . .public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: (0x0009) ACC_PUBLIC, ACC_STATICCode:stack=4, locals=1, args_size=10: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;3: new           #3                  // class java/lang/StringBuilder6: dup7: invokespecial #4                  // Method java/lang/StringBuilder."":()V10: ldc           #5                  // String Hello,12: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;15: aload_016: iconst_017: aaload18: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;21: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;24: invokevirtual #8                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V27: return

JDK 8和JDK 11中的显式StringBuffer使用相同

package dustin.examples;import static java.lang.System.out;public class HelloWorldStringBuffer
{public static void main(final String[] arguments){out.println(new StringBuffer().append("Hello, ").append(arguments[0]).toString());}
}

HelloWorldStringBuffer.main(String[]) JDK 8 javap输出

Classfile /C:/java/examples/helloWorld/classes/dustin/examples/HelloWorldStringBuffer.classLast modified Jan 28, 2019; size 623 bytesMD5 checksum fdfb90497db6a3494289f2866b9a3a8bCompiled from "HelloWorldStringBuffer.java"
public class dustin.examples.HelloWorldStringBufferminor version: 0major version: 52. . .public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=4, locals=1, args_size=10: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;3: new           #3                  // class java/lang/StringBuffer6: dup7: invokespecial #4                  // Method java/lang/StringBuffer."":()V10: ldc           #5                  // String Hello,12: invokevirtual #6                  // Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;15: aload_016: iconst_017: aaload18: invokevirtual #6                  // Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;21: invokevirtual #7                  // Method java/lang/StringBuffer.toString:()Ljava/lang/String;24: invokevirtual #8                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V27: return

HelloWorldStringBuffer.main(String[]) JDK 11 javap输出

Classfile /C:/java/examples/helloWorld/classes/dustin/examples/HelloWorldStringBuffer.classLast modified Jan 28, 2019; size 623 bytesMD5 checksum e4a83b6bb799fd5478a65bc43e9af437Compiled from "HelloWorldStringBuffer.java"
public class dustin.examples.HelloWorldStringBufferminor version: 0major version: 55. . .public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: (0x0009) ACC_PUBLIC, ACC_STATICCode:stack=4, locals=1, args_size=10: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;3: new           #3                  // class java/lang/StringBuffer6: dup7: invokespecial #4                  // Method java/lang/StringBuffer."":()V10: ldc           #5                  // String Hello,12: invokevirtual #6                  // Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;15: aload_016: iconst_017: aaload18: invokevirtual #6                  // Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;21: invokevirtual #7                  // Method java/lang/StringBuffer.toString:()Ljava/lang/String;24: invokevirtual #8                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V27: return

JDK 8和JDK 11处理循环字符串串联

对于我的JEP 280更改行为的最后一个示例,我使用一个代码示例,该示例可能会冒犯某些Java开发人员的敏感性,并在循环内执行字符串连接。 请记住,这只是一个示例,一切都可以,但不要在家中尝试。

package dustin.examples;import static java.lang.System.out;public class HelloWorldStringConcatComplex
{public static void main(final String[] arguments){String message = "Hello";for (int i=0; i<25; i++){message += i;}out.println(message);}
}

HelloWorldStringConcatComplex.main(String[]) JDK 8 javap输出

Classfile /C:/java/examples/helloWorld/classes/dustin/examples/HelloWorldStringConcatComplex.classLast modified Jan 30, 2019; size 766 bytesMD5 checksum 772c4a283c812d49451b5b756aef55f1Compiled from "HelloWorldStringConcatComplex.java"
public class dustin.examples.HelloWorldStringConcatComplexminor version: 0major version: 52. . .public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=3, args_size=10: ldc           #2                  // String Hello2: astore_13: iconst_04: istore_25: iload_26: bipush        258: if_icmpge     3611: new           #3                  // class java/lang/StringBuilder14: dup15: invokespecial #4                  // Method java/lang/StringBuilder."":()V18: aload_119: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;22: iload_223: invokevirtual #6                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;26: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;29: astore_130: iinc          2, 133: goto          536: getstatic     #8                  // Field java/lang/System.out:Ljava/io/PrintStream;39: aload_140: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V43: return

HelloWorldStringConcatComplex.main(String[]) JDK 11 javap输出

Classfile /C:/java/examples/helloWorld/classes/dustin/examples/HelloWorldStringConcatComplex.classLast modified Jan 30, 2019; size 1018 bytesMD5 checksum 967fef3e7625965ef060a831edb2a874Compiled from "HelloWorldStringConcatComplex.java"
public class dustin.examples.HelloWorldStringConcatComplexminor version: 0major version: 55. . .public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: (0x0009) ACC_PUBLIC, ACC_STATICCode:stack=2, locals=3, args_size=10: ldc           #2                  // String Hello2: astore_13: iconst_04: istore_25: iload_26: bipush        258: if_icmpge     2511: aload_112: iload_213: invokedynamic #3,  0              // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;I)Ljava/lang/String;18: astore_119: iinc          2, 122: goto          525: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;28: aload_129: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V32: return

Heinz M. Kabutz博士和Dmitry Vyazelenko在演示文稿“ Java.lang.String足以 使我们自己吊起来…… ”中讨论了JEP 280引入的Java字符串连接更改,并对其进行了简要总结,“ +不再编译为StringBuilder 。 ” 他们在“今天的经验教训”幻灯片中指出:“在可能的情况下使用+代替StringBuilder ”和“为Java 9+重新编译类”。

在JDK 9中针对JEP 280实施的更改“将使String连接的未来优化成为可能,而无需进一步更改javac发出的字节码。” 有趣的是,最近宣布JEP 348 (“ JDK API的Java编译器内在特性”)现在是候选JEP,它旨在使用类似的方法来编译String::formatObjects::hash

翻译自: https://www.javacodegeeks.com/2019/02/jdk-9-jep-280-string-concatenations.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】广东开放大学 综合英语1 形成性考核 (36)

选择题 题目&#xff1a; I love traveling in the countryside, but I don’t like losing my way. I went on a trip recently, but my trip took me longer than I expected. “I’m going to Woodford Green,” I said to the conductor as I got on the bus, “b…

蓝桥杯基础模块7:PWM脉宽调制

一、 模块题目 二、 原理简述 脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。随着电子技术的发展,出现了多种脉冲宽度调制(Pulse width modulation,PWM)技术,其中包括:相电压控…

【渝粤教育】电大中专Office办公软件 (14)作业 题库

1学习好Office办公软件这门课程&#xff0c;应该&#xff08;&#xff09;。 A重视理论学习 B重视上机操作&#xff0c;多练多试&#xff0c;还要学习好基础的知识 C只看不练 D可以随便学习一下 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2在使用Office2016时遇…

蓝桥杯基础模块8_1:串口通信收发

一、模块题目 二、原理简述 1、串口重要概念概述 <1> 串行通信是指数据一位接一位地顺序发送或接收。 <2> 串行通信有SPI、IIC、UART等多种,最常见最通用的是指UART,无特殊说明,本文指的就是UART。 <3> 串行通信的制式有:单工、半双工、全双工三种。 &l…

【渝粤教育】电大中专中医基础知识 作业 题库

1.“证”是指 A.疾病的体征与症状 B.对疾病的症状与体征的分析 C.对疾病某一阶段的病理概括 D.对疾病全过程规律的认识 E.对疾病的症状与体征的调查 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;未作答 2.中医学认识疾病和治疗疾病的基本思路是 A.恒动观念 B.同病异…

从JDK 12删除原始字符串文字

已经提出从JDK 12 &#xff08;它将在12月13日进入Rampdown第一阶段 &#xff09;中删除原始字符串文字&#xff08;预览 &#xff09;。 Brian Goetz撰写了删除此预览功能的动机的详细描述 &#xff08; JEP 326 &#xff09;。 在Java subreddit上也对此进行了讨论。 在帖子“…

【渝粤教育】电大中专公共基础课程_1作业 题库

1中央广播电视中等专业学校是一所依托&#xff08;&#xff09;设置的运用现代化教学手段和多媒体教学开展中等专业学历教育的开放性学校。 A国家开放大学 B技工学院 C技能培训学校 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2并面向社会直接招收初中毕业生和在…

蓝桥杯基础模块8_2:串口进阶

一、模块题目 二、原理简述 串行接口作为51单片机的重要外设,编程操作并不复杂,但在实际的项目应用中,由于数据结构和通信规约的不同,其程序逻辑也有各种变化。 一般情况下,上位机的命令可能不是一个字节,而是多个字节组成的命令帧,有的长度固定,有的长度变化;而且要…

【渝粤教育】电大中专常见病药物治疗 (3)作业 题库

1.以下对‘发热的指标’的叙述中&#xff0c;不正确的是&#xff08;&#xff09;。 A.腋下温度超过37.0℃ B.口腔温度超过37.3℃ C.直肠温度超过37.6℃ D.腋下温度超过37.6℃ E.昼夜体温波动超过1℃ 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;E 2.发热的程度按体…

蓝桥杯基础模块9:IO口扩展与存储器映射

一、模块题目 二、原理简述 三、源码 (1)I0扩展 //头文件 #include "reg52.h" //延时函数 void Delay(unsigned int t) {

【渝粤教育】电大中专建设工程法规 (3)作业 题库

1建造师在工作中&#xff0c;必须严格遵守法律、行政、行业管理规范、职业道德。 A正确 B错误 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2注册建造师应当在相应的岗位上执业。但同时&#xff0c;国家鼓励和提倡注册建造师()。 A一师专岗 B一师多岗 C专岗专职 …

netty 压缩比_使Netty 4中的HTTP内容压缩工作

netty 压缩比Netty实际上是一个很棒的框架&#xff0c;提供了构建高性能HTTP服务器所需的所有功能。 令人高兴的是&#xff0c;几乎所有东西都是开箱即用的&#xff0c;只是必须以正确的方式组合在一起。 内容压缩 &#xff08;gzip或deflate&#xff09;也不例外。 但是&#…

蓝桥杯单片机基础学习00_1

一、基础准备 1、烧录软件 (1)单片机型号:IAP15F2K61S2 (2)输入用户程序运行时的IRC频率:11.0592MHz 2、CT107D单片机综合实训平台 CT107D:单片机芯片(全I/O兼容8051系列,为保留P3.6,P3.7的WR,RD功能由P4.2,P4.4替换。);显示模块;输入/输出模块;传感模块;存储/A…

带有Oracle Digital Assistant和Fn Project的会话式UI

在这里和那里&#xff0c;我们看到许多预测&#xff0c;很快聊天机器人将在用户与其系统之间的通信中扮演关键角色。 我没有水晶球&#xff0c;也不想等待这个“很快”&#xff0c;所以我决定现在就使这些预言成真&#xff0c;看看它的样子。 我正在工作的公司的标志产品是Fle…

【渝粤教育】电大中专测量学 (2)作业 题库

1.测量学是研究地球的形状和大小以及确定地面点&#xff08;&#xff09;位置的科学。 A.平面 B.空间 C.曲面 D.高程 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.测量学中的水准面是一个&#xff08;&#xff09;。 A.斜平面 B.水平面 C.竖直面 D.曲面 正确 正…

【渝粤教育】电大中专电商运营实操 (1)作业 题库

1.电子商务的特点包括&#xff1a;交易环节少&#xff0c;营销成本低&#xff1b;全球性&#xff1b;简单的电子化支付手段&#xff1b;客户信息易于管理&#xff1b;符合全球经济发展要求&#xff1b;社会性&#xff1b;信息化。 &#xff08; &#xff09; A.错误 B.正确 错误…

蓝桥杯单片机基础学习00_2

三、功能模块 4、中断系统 中断系统 1&#xff09;中断的概念&#xff1a;这是大家需要在脑子里有的一个印象&#xff0c;我们大致可以将中断描述成CPU在处理某一事件A时&#xff0c;发生了另一事件B请求CPU迅速去处理&#xff08;中断发生&#xff09;&#xff1b;CPU暂时中…

【渝粤教育】电大中专电商运营实操12作业 题库

1.电子商务最重要的是&#xff08; &#xff09; A.信息技术 B.货物 C.商务 D.网站 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.电子商务对实体店产生革命性的影响&#xff0c;它会快速提高现在零售业的服务标准。 &#xff08; &#xff09; A.正确 B.错误 错…

【渝粤教育】电大中专电子商务网站建设与维护 (26)作业 题库

1.阿里巴巴信息服务栏目主要包括以下内容&#xff1a;商业机会、产品展示、公司全库、行业资讯、价格行情、以商会友、商业服务。 &#xff08; &#xff09; A.正确 B.错误 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.阿里巴巴取得成功的因素主要有&#xff…

通信原理速识1:绪论

模块1 通信系统的端到端框架 &#xff08;一&#xff09;模拟通信系统 存在的两种变换 1.发送端&#xff1a;把连续信息变换成原始电信号&#xff08;基带信号&#xff09;&#xff08;信源&#xff09; 接收端&#xff1a;把电信号变换成连续消息&#xff08;受信&#xff09;…