jep290涉及jdk版本_JDK 9 / JEP 280:字符串串联永远不会相同

jep290涉及jdk版本

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

下面的简单Java类名为“ HelloWorldStringConcat”将用于第一次演示。

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

jep290涉及jdk版本

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

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

相关文章

label标签/标记

label 标签用于指定表单项的文字描述信息&#xff0c;如下所示&#xff1a; <label for"username">用户名称&#xff1a;</label> <input id"username" name"username">label 标签 的 for 属性指定的值与 input 标签的 id 属…

矩阵累积相乘 java_累积:轻松自定义Java收集器

矩阵累积相乘 javaAccumulative是针对Collector<T, A, R>的中间累积类型A提出的接口Collector<T, A, R>以使定义自定义Java Collector更加容易。 介绍 如果您曾经使用过Java Stream &#xff0c;那么很可能会使用了一些Collector &#xff0c;例如&#xff1a; C…

java socket 传输压缩文件_java基于socket传输zip文件功能示例

本文实例讲述了java基于socket传输zip文件的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;服务器端程序&#xff1a;import java.io.*;import java.net.*;import java.io.BufferedInputStream;public class SocketServer {ServerSocket ssnull;Socket snull;Dat…

css的学习

文章目录内联样式内部样式外部样式CSS语法格式选择器基本选择器ID 选择器元素选择器类选择器不带标签名带标签名通用选择器并集选择器选择器的优先级扩展选择器组合选择器属性选择器伪类选择器伪元素选择器css 是 Cascading Style Sheets&#xff0c;层叠样式表。 层叠含义是多…

java throws catch_java异常处理throws throw try-catch实例

java异常处理throws throw try-catch实例。throw用于方法中&#xff0c;我们可以预见的错误。比如&#xff1a;if(age<0){Exception e new Exception();//创建异常对象throw e;//抛出异常}在java代码中如果发生异常的话&#xff0c;jvm会抛出异常对象&#xff0c;导致程序代…

java 开发人员工具_每个Java开发人员都应该知道的10个基本工具

java 开发人员工具大家好&#xff0c;我们已经到了2019年的第二个月&#xff0c;我相信你们所有人都已经制定了关于2019年学习以及如何实现这些目标的目标。 我一直在撰写一系列文章&#xff0c;为您提供一些知识&#xff0c;使您可以学习和改进以成为2019年更好的全方位开发人…

SpringBoot2.x+mybatis plus3.x集成Activit7版本

文/朱季谦 在Activiti6版本当中&#xff0c;若要集成到Springboot里&#xff0c;需要写一些额外的配置类&#xff0c;我曾经在Activiti工作流框架学习笔记&#xff08;二&#xff09;之springboot2.0整合工作流Activiti6.0一文当中总结过相关配置过程&#xff0c;感兴趣的同学…

camel apache_Apache Camel 3的工作终于开始了

camel apache我们正在开始Apache Camel 3的工作。 我们正在多方面努力改善骆驼并引入新功能。 Guillaume Nodet实际上是在10月初开始了第一项工作&#xff0c;他通过清理代码库&#xff0c;删除不推荐使用的代码和组件&#xff0c;改进了路由引擎和核心中的其他内部组件开始了…

(前端开发)表格中的行全选、全不选、反选以及数据行背景色变换的示例代码

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表格数据行全选/全不选/反选的示例</title><style>table {border: 1px solid;width: 500px;margin-left: 30%;}th, td {text-align: cente…

future java 多线程_Java多线程之Future与FutureTask

一&#xff1a;Future在使用实现Callable创建线程时&#xff0c;call()方法是有返回值的。那么&#xff0c;我们在编程时用什么来代表这个 线程执行后才能返回的未来结果 呢&#xff1f;那就是 Future类型。顾名思义&#xff0c;Future——未来值&#xff0c;我们用这个未来值来…

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

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

win7旗舰版安装不了python_怎样在Win7 64位旗舰版安装Python+Eclipse开发环境

自从上周抛弃了WinXP转而安装了Win7&#xff0c;64位后&#xff0c;尝试安装PythonEclipse遇到了一点小问题。现在已经解决&#xff0c;将安装顺序记录如下&#xff0c;供参考。Setp1&#xff0c;到ORACLE网站下载64位的JDK。http://www.oracle.com/technetwork/java/javase/do…

MacOS下的取色器/拾色器推荐

文章目录ColorSnapper2ColorSlurp 不错&#xff0c;App Store 可以下载SipChromaColor PickerPixeur&#xff08;推荐&#xff09;操作说明ColorSnapper2 ColorSlurp 不错&#xff0c;App Store 可以下载 Sip Chroma Color Picker Pixeur&#xff08;推荐&#xff09; 体…

查看oracle会话和进程_带有Oracle Digital Assistant和Fn Project的会话式UI

查看oracle会话和进程在这里和那里&#xff0c;我们看到了无数的预测&#xff0c;很快聊天机器人将在用户与其系统之间的通信中扮演关键角色。 我没有水晶球&#xff0c;也不想等待这个“很快”&#xff0c;所以我决定现在就使这些预言成真&#xff0c;看看它是什么样。 我正在…

设置 input元素placeholder的字体颜色

placeholder 属性提供可描述输入字段预期值的提示信息&#xff08;hint&#xff09;。 该提示会在输入字段为空时显示&#xff0c;并会在字段获得焦点时消失。 placeholder 属性适用于以下的 <input> 类型&#xff1a;text, search, url, telephone, email 以及 passwo…

网页益智游戏怎么制作_休息一下,或者:如何使用Java 12制作出色的益智游戏...

网页益智游戏怎么制作Java 12以实验形式提供了switch表达式以及switch和break语句的新形式。 对于可能很少用到的构造&#xff0c;有大量的新语法和语义-当然&#xff0c;对于那些困惑者和认证考试问题的作者来说&#xff0c;这是一件了不起的礼物。 如果您喜欢Java拼图游戏&am…

java aes 解密 文件_Java AES文件加解密

转自&#xff1a;http://www.webtag123.com/java/4049.htmlAESUtils.javapackage demo.security;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.security.Key;imp…

JavaScript(JS)的习惯写法总结

//取整 parseInt(a,10); //Before Math.floor(a); //Before a>>0; //Before ~~a; //After a|0; //After//四舍五入 Math.round(a); //Before a.5|0; //After//内置值 undefined; //Before void 0; //After, 快 0[0]; //After, 略慢//内置值 Infinity; 1/0;//布尔值短写法…

java模拟连接超时_Java:使用Toxiproxy模拟各种连接问题

java模拟连接超时用Toxiproxy和Java的HttpURLConnection模拟各种连接问题&#xff0c;以查看产生了什么样的错误&#xff1a;连接超时vs.读取超时vs.连接被拒绝…。 结果&#xff1a; 系统&#xff1a;openjdk 11.0.1 2018-10-16 (.setConnectTimeout 1) > java.net.Socke…

java中的僵死进程_Java中线程间怎么通讯?什么叫僵死线程?

《尸家保镖》 《猛鬼出千》 《不死心灵》 《大家发财》 《灵幻少女》 《九天玄女》 《僵尸至尊》 《湘西尸王》 《尸前想后》 《魔高一丈》 《一世好命》 《妖兽尸王》 《人蝎大战》 《星际钝胎》 《艳女还魂》 《邪完再邪》 《艳鬼山坟》 《尸破今天阳光很好&#xff0c;坐在窗…