JDK各个版本特性讲解-JDK11特性

JDK各个版本特性讲解-JDK11特性

  • 一、JAVA11 概述
  • 二、语法层次的变化
    • 1. 局部变量类型推断升级
  • 三、API层次的提升
    • 1. String新增的方法
    • 2. Optional新增方法
    • 3.HTTPClient
  • 四、其他变化
    • 1. 更简化的编译运行
    • 2.ZGC
    • 3.其他了解

一、JAVA11 概述

  2018年9月26日,Oracle官方发布JAVA11.这是JAVA大版本周期变化后的第一个长期支持版本,非常值得关注.最新发布的JAVA11将带来ZGC HttpClient等重要特性,一共17个需要我们关注的JEP,参考文档http://openjdk.java.net/projects/jdk/11/

image.png

具体的特性介绍

  • 181:基于嵌套的访问控制
  • 309:动态类文件常量
  • 315:改进Aarch64 Intrinsics
  • 318:Epsilon:一个无操作的垃圾收集器
  • 320:移除Java EE和CORBA模块
  • 321:HTTP客户端(标准)
  • 323:本地变量语法Lambda参数
  • 324:与Curve25519和Curve448的密钥一致
  • 327: Unicode 10
  • 328:飞行记录器
  • 329: ChaCha20和Poly1305密码算法
  • 330:启动单文件源代码程序
  • 331:低开销堆分析
  • 332: TLS (Transport Layer Security) 1.3
  • 333:ZGC:一个可伸缩的低延迟垃圾收集器 (实验)
  • 335:已弃用Nashorn JavaScript引擎
  • 336:已弃用Pack200工具和API

二、语法层次的变化

1. 局部变量类型推断升级

  局部变量类型推断是java10开始新增的新特性,java11中对局部变量推断进行了升级,在var支持添加注解的语法格式,JAVA10中是无法实现的,在JAVA11中加入了这样的语.

lambda表达式中,注解修饰变量的时候,变量的数据类型必须要写,不能省略,像下面这种写法就是错误的

Consumer<String> con =(@Deprecated  t) -> System.out.println(t.toLowerCase());

这个时候就必须要为小括号中的参数添加数据类型,应该这样写

Consumer<String> con =(@Deprecated String t) -> System.out.println(t.toLowerCase());

java11中,lambda表达式中的参数数据类型可以使用var,但是不能不写

Consumer<String> con =(@Deprecated var t) -> System.out.println(t.toLowerCase());

三、API层次的提升

1. String新增的方法

  在JDK11中对String处理新增的很多方法。简化对字符串的操作

描述举例
判断字符串是否为空白" ".isBlank(); // true
去除字符串首尾空白" www.boge.com ".strip(); // “www.boge.com”
去除字符串尾部空格" www.boge.com “.stripTrailin(); // " www.boge.com”
去除字符串首部空格" www.boge.com ".stripLeading(); // "www.boge.com "
复制字符串“boge”.repeat(2);// “bogeboge”
行数统计“A\nB\nC\nD”.lines().count(); // 4
    public static void main(String[] args) {// 判断字符串是否为空白boolean b = " ".isBlank();// true// 去除字符串首尾空白String s1 = " www.boge.com ".strip();// "www.boge.com"// 去除字符串尾部空格String s2 = " www.boge.com ".stripTrailing();// " \n \twww.boge.com"// 去除字符串首部空格String s3 = " www.boge.com ".stripLeading();// "www.boge.com\n \t "// 复制字符串String r = "boge".repeat(2);// "bogeboge"// 行数统计long c = "A\nB\nC\nD".lines().count();// 4System.out.println(s1);System.out.println(s2);System.out.println(s3);System.out.println(r);System.out.println(c);}

image.png

2. Optional新增方法

  Optional也增加了几个非常好用的方法,现在可以很方便的把一个Optional转换成一个Stream,或者当一个空Optional时,给它一个替代的. 我们发现从JDK8开始出现Stream以后,每个版本都有相关的更新.

新增方法描述新增版本
boolean isEmpty()判断value是否为空JDK11
T orElseThrow()value非空,返回value,否则抛出NoSuchElementExpceptionJDK10
ifPresentOrElse(Consumer<? super T> action,Runnable emptyAction)value非空,执行参数1功能,如果value为空,执行参数2功能JDK9
Optional<T>or(Supplier<? extends Optional<? extends T> supplier)value非空,返回对应的Optional,value为空,返回形参封装的OptionalJDK9
Stream<T>stream();value非空,返回一个仅包含此value的Steam,否则,返回一个空的StreamJDK9
    public static void main(String[] args) {Optional<String> optional =Optional.empty();//JDK8 判断value是否存在System.out.println(optional.isPresent());//JDK11 判断value是否为空System.out.println(optional.isEmpty());//JDK10 返回value,如果为null则直接抛出 NoSuchElementExpceptionOptional<String> optional2 = Optional.of("element1");String value = optional2.orElseThrow();System.out.println(value);//JDK9  value非空,执行参数1功能,如果value为空,执行参数2功能Optional<String> optional3 =Optional.empty();// Optional.of("element1");optional.ifPresentOrElse((v)-> System.out.println("value为"+v),()-> System.out.println("value为null"));// JDK9 value非空,返回对应的Optional,value为空,返回形参封装的OptionalOptional<String> optional4 =Optional.empty();// Optional.of("element1");Optional<String> optional5 = optional4.or(() -> Optional.of("element2"));System.out.println(optional5);// JDK9 value非空,返回一个仅包含此value的Steam,否则,返回一个空的StreamOptional<String> optional6 =Optional.of("element3");//Optional.empty();Stream<String> stream = optional6.stream();stream.forEach(System.out::println);}

image.png

3.HTTPClient

  HTTP,用于传输网页的协议,在1997年就被采用1.1的版本中,到2015年,HTTP2才成为标准. HTTP1.1和HTTP2的主要区别就是如何在客户端和服务器之间构建和传输数据, HTTP1.1依赖请求/响应周期. HTTP2允许服务器push数据:它可以发送比客户端请求更多的数据.这使得他可以优先处理并发送对于首先加载网页至关重要的数据.

image.png

  JAVA9开始引入一个处理HTTP请求的HTTPClient API,该API支持同步和异步,而在JAVA11中成为正式可用状态,可以在java.net包中找到这个API,它将替代仅适用于bolocking模式的HTTPUrlConnection(创建于Http1.0s时代,并使用了协议无关的方法),并提供对WebSocket和HTTP2的支持

//HttpClient 替换原有的HttpUrlConnection  同步方式
HttpClient client =HttpClient.newHttpClient();
HttpRequest request =HttpRequest.newBuilder(URI.create("http://127.0.0.1:8080/demo")).build();
HttpResponse.BodyHandler<String> respnoseBodyHandler= HttpResponse.BodyHandlers.ofString();
HttpResponse<String> response =client.send(request,respnoseBodyHandler);
String body = response.body();
System.out.println(body);
//HttpClient 替换原有的HttpUrlConnection  异步方式
HttpClient client =HttpClient.newHttpClient();
HttpRequest request =HttpRequest.newBuilder(URI.create("http://127.0.0.1:8080/demo")).build();
HttpResponse.BodyHandler<String> respnoseBodyHandler= HttpResponse.BodyHandlers.ofString();
CompletableFuture<HttpResponse<String>> sendAsync = client.sendAsync(request, respnoseBodyHandler);
sendAsync.thenApply(t-> t.body()).thenAccept(System.out::println);

四、其他变化

1. 更简化的编译运行

  JAVA11 提供了更简化的编译运行程序,编译一个java源代码文件语法应该是

javac Test1.java

  解释执行一个java字节码的语法应该是

java Test1

  在我们目前的知识里面,运行一个java源代码必须经过两个不中,一个是编译,一个是解释执行,而在java11中,通过一个java命令就可以直接搞定了,语法是:

java Test1.java

需要注意的是:

  1. 源代码文件中如果有多个类,执行源文件中的第一个类中主方法,注意这里的第一个是代码顺序的第一个,和是否由public修饰无关
  2. 不可以使用其他源文件中定中自定义的类,当前文件中自定义的类是可以使用的

定义一个源代码文件进行测试

public class HelloJAVA11{public static void main(String[] args){System.out.println("HelloJAVA11.main");// 实例化当前文件中的Person类Person p=new Person();// 实例化另一个文件中的Student类Student stu =new Student();}}class Person {private String pid;private String pname;}
class Test2{public static void main(String[] args){System.out.println("Test2.main");}
}
public class Student{}

如果当前文件中,没有使用其他文件中的类,可以直接运行成功

image.png

如果当前文件中使用类其他文件中的类,那么会出现异常

image.png

2.ZGC

  GC 是java的主要优势之一(另一个是强大的JVM),永远都是java优化的一个核心点. 然而,当GC的STW(stop the world)太长,就会影响应用的响应时间. 消除或者减少GC的停顿时长,将会使JAVA对更广泛的引用场景成为一个更具有吸引力的平台. 此外,现代系统中可用内存不断增长,用户和程序员希望JVM能够以更高效的方式利用这些内存,并且无需长时间STW. ZGC A Scalable Low-Latency Garbage Collector(Experimental).作为JDK11最瞩目的特征,但是后面带了Experimental,说明是实验版本,也就不建议在生产环境中使用.ZGC是一个并发,基于 region的压缩性垃圾收集器,只有root扫描阶段会STW,因此GC停顿时间不会随着堆的增长和存活对象的增长而变长.

优势:

  • 暂停时间不会超过10ms
  • 既能处理几百兆的小堆,也能处理几个T的大堆(OMG)
  • 和G1相比,应用吞吐能力不会下降超过15%
  • 为未来的GC功能和利用colord指针以及Load Barriers优化奠定基础
  • 初始只支持64位系统

设计目标:

  1. 支持TB级内存容量,暂停时间低(<10ms),对整个程序吞吐量的影响小于15%
  2. 将来还可以扩展实现机制,用以支持很多让人兴奋的功能. 如多层堆或者压缩堆

PS: 多层堆即对象置于DRAM和冷对象置于NVMe闪存

3.其他了解

  • unicode10
  • Deprecate The Pack200 Tools and API
  • 新的Epsilon垃圾收集器
  • 完全支持Linux容器,包括Docker
  • 支持G1上的并行完全垃圾收集
  • 最新的HTTPS安全协议TLS 1.3
  • JAVA Flight Recoder

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

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

相关文章

JavaScript 文件优化指南

JavaScript 文件是web应用程序的重要组成部分&#xff0c;但网站速度和用户体验对网站的成功至关重要。因此&#xff0c;优化 JavaScript 文件以确保无缝体验至关重要。优化 JavaScript 文件可以解决渲染阻塞、页面加载时间、文件大小等问题。 了解JavaScript优化 JavaScript 优…

企业数字化转型如何影响企业 ESG 表现 —来自中国上市公司的证据(数据复现+代码)

数据来源&#xff1a;自主整理 时间跨度&#xff1a;2010-2020年 数据范围&#xff1a;中国沪深 A 股上市公司 数据指标&#xff1a; 类型 变量 符号 变量定义 证券代码 stkcd 年份 year 股票简称 name 被解释变量 ESG ESG 华证ESG季度评级赋值1-9分&#xff0c;取…

如何开发一个prompt?prompt的使用有哪些原则?

提示词使用原则 如何开发一个跟自己预期结果接近的提示词&#xff1f;有哪些基本原则&#xff1f; 提示词迭代开发 写提示词时&#xff0c;第一次尝试是值得的&#xff0c;反复完善提示&#xff0c;获得越来越接近你想要的结果 原文来源于B站吴恩达提示工程教学公开课。…

计算机msvcp120.dll文件丢失怎么办?亲测有效的五个方法分享

最近&#xff0c;我在使用电脑的过程中遇到了一个非常棘手的问题&#xff0c;那就是msvcp120.dll文件丢失。这个错误通常会导致某些应用程序无法正常运行。经过一番努力和尝试&#xff0c;我终于找到了解决这个问题的方法&#xff0c;&#xff0c;小编将介绍五个常用的解决方法…

CAS-源码分析引出Unsafe类、Unsafe类详解

CASDemo演示 public class CASDemo {public static void main(String[] args) {AtomicInteger atomicInteger new AtomicInteger(5);System.out.println(atomicInteger.compareAndSet(5, 2022) "\t" atomicInteger.get());//true 2022System.out.println(atomicI…

AUTOSAR CanTSyn时间同步模块配置与代码实现(一)

AUTOSAR CanTSyn模块配置与代码实现 1、CanTSyn模块配置 2、CanTSyn_RxIndication CanTSyn_Config_ptr指向配置的结构体&#xff0c;RxPduId只有一条报文的话&#xff0c;RxPduId0 下面是解析接收到的报文的各个参数。 SYNC报文的格式分为两种&#xff0c;一种是带CRC的&am…

vmware离线安装docker-compose

vmware离线安装docker-compose 最近安装docker-compose&#xff0c;发现git取拉取&#xff0c;不是拒绝连接就是报443错误&#xff0c;或者其他错误 最后发现用包直接传上去好用&#xff0c;不用git拉取了 离线安装docker-compose 本文章给的docker-compose离线包&#xff0c;…

【Spring】14 ApplicationEventPublisherAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 创建启动类3.4 启动3.5 工作流程图 4. 应用场景总结 Spring 框架为开发者提供了丰富的扩展点&#xff0c;其中之一是 Bean 生命周期中的回调接口。本文将专注介绍一个与事件发布相关的接口 Applicatio…

快速入门ESP32—— 解决platformIO添加开源库下载失败的问题

相关文章 快速入门ESP32——开发环境配置Arduino IDE 快速入门ESP32——开发环境配置PlatformIO IDE 快速入门ESP32—— platformIO添加开源库和自己的开发库 快速入门ESP32—— 解决platformIO添加开源库下载失败的问题 前言一、通过github链接直接下载1、下载步骤2、现象 前言…

【PostgreSQL内核学习(十八)—— 存储管理(存储管理的体系结构)】

存储管理 概述存储管理器的体系结构存储管理器的主要任务读写元组过程 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的情况下注明引用来源。 本文主要参考…

@德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?

德人合科技 | 天锐绿盾加密软件是一款全面保障企业电脑数据和安全使用的加密软件 PC端访问地址&#xff1a;www.drhchina.com 它的功能包括但不限于&#xff1a; 实时操作日志&#xff1a;可以实时详细地记录所有终端的操作日志&#xff0c;包括终端上窗口标题的变换、程序的…

探秘 AJAX:让网页变得更智能的异步技术(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…