JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK11特性讲解】

news2024/11/18 1:35:34

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

lecture:波哥

image.png

一、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();// 4
        System.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则直接抛出 NoSuchElementExpception
        Optional<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为空,返回形参封装的Optional
        Optional<String> optional4 =Optional.empty();// Optional.of("element1");
        Optional<String> optional5 = optional4.or(() -> Optional.of("element2"));
        System.out.println(optional5);

        // JDK9 value非空,返回一个仅包含此value的Steam,否则,返回一个空的Stream
        Optional<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.coloradmin.cn/o/72822.html

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

相关文章

Docker_简介、优势、架构、常用命令

Docker简介 Docker是什么 Docker就是将环境在不消耗大量资源的情况下复制出一个一样的环境 一次镜像&#xff0c;处处运行 内核级虚拟化 基于GO语言实现的开源项目 解决运行环境和配置问题的软件容器 容器与虚拟机比较 虚拟机是模拟的整套操作系统&#xff0c;会有资源占用…

Unity Cg着色器开发教程

Unity Cg着色器开发教程 学习在 Unity 中对图形管道进行编程&#xff0c;以便为游戏对象创建独特的视觉表面 课程英文名&#xff1a;Shader Development from Scratch for Unity with Cg 此视频教程共2.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c…

代码随想录算法训练营第二天| 977.有序数组的平方, 209.长度最小的子数组, 59.螺旋矩阵II

代码随想录算法训练营第二天| 977.有序数组的平方&#xff0c; 209.长度最小的子数组&#xff0c; 59.螺旋矩阵II 题目链接: 977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排…

ASEMI整流桥KBU610和KBP210封装参数区别

编辑-Z 很多人在选型时容易把KBU和KBP给搞混&#xff0c;这两种封装是有区别的&#xff0c;下面是整流桥KBU610和KBP210封装参数区别。 整流桥KBU610参数&#xff1a; 型号&#xff1a;KBU610 封装&#xff1a;KBU-4 最大重复峰值反向电压&#xff08;VRRM&#xff09;&…

1557_AURIX_TC275_复位控制单元以及相关寄存器

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这是之前没看完的一张表&#xff0c;结合之前的一般看起来&#xff0c;大部分的模块还是支持重启机制的。 状态寄存器中可以读到上一次复位的触发原因&#xff0c;这个对于软件的一些状态判…

嵌入式分享合集118

一、模电--数电 晶体管 VS 二进制数 模电里面的二极管、三极管&#xff08;开关状态&#xff09;、晶闸管&#xff0c;分别对应数电的二进制数0和1。 放大器 VS 乘法/移位器 模电里的放大器就是把信号放大N倍&#xff0c;对应数电里面的乘法&#xff0c;当然如果乘的系数是2的…

C# SuperSocket 手把手教你入门 傻瓜教程---6(SuperSocket内置的命令行协议)

C# SuperSocket 手把手教你入门 傻瓜教程系列教程 C# SuperSocket 手把手教你入门 傻瓜教程---1&#xff08;服务器单向接收客户端发送数据&#xff09; C# SuperSocket 手把手教你入门 傻瓜教程---2&#xff08;服务器和客户端双向通信&#xff09; C# SuperSocket 手把手教…

No.1 初步认识Vue2.0

目录一、准备工作二、简单使用Vue2.1 初步使用Vue绑定2.2 Vue中数据绑定&#xff08;用于表单元素&#xff0c;即有value属性的元素&#xff09;2.2.1 单向数据绑定2.2.2 双向双向数据绑定2.2.3 数据绑定的简写2.3 Vue中el与data的两种书写方式2.3.1 el的写法——方式一2.3.2 e…

流体力学课上的老师这句话,让我义无反顾的上了CFD这艘“贼船”

CAE&#xff08;Computer Aided Engineering&#xff09;&#xff1a;利用计算机辅助求解分析复杂工程和产品的结构力学性能并进行优化&#xff0c;涵盖的分析对象包括结构、流体、热、电磁等。在工业4.0和中国制造2025大趋势下&#xff0c;CAE技术已上升为国家战略&#xff0c…

葡聚糖修饰线性聚乙烯亚胺(Dex-SS-LPEI)|A54修饰葡聚糖-PLGA嫁接物胶束

葡聚糖修饰线性聚乙烯亚胺(Dex-SS-LPEI)|A54修饰葡聚糖-PLGA嫁接物胶束 葡聚糖修饰线性聚乙烯亚胺(Dex-SS-LPEI) 产品描述&#xff1a;通过二硫吡啶端基化的线性聚乙烯亚胺(LPEI-SSPy,M_n5 000)与巯基化葡聚糖(Dex-SH,Mw5 000)的偶联反应,制备出生物还原响应的葡聚糖基线…

基于数字孪生概念,开启精细化城市管理模式

一座城市囊括森罗万象&#xff0c;各个领域的数据资源繁冗复杂&#xff0c;政务、经济、民生等问题层出不穷&#xff0c;管理者基本上很难对整座城市进行统一管理。由此&#xff0c;业内提出了“智慧城市”的概念。 最开始的时候&#xff0c;智慧城市可视化仅仅停留在把数据图形…

集成Springboot+Prometheus+Grafana

Springboot pom.xml导入prometheus依赖 <!--prometheus--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>io.mi…

Docker——DockerCompose简单使用

目录 一、DockerCompose 1.1 基本介绍 1.2 Centos7安装DockerCompose 1.2.1 安装 1.2.2 修改文件权限 1.2.3 Base自动补全命令 二、部署微服务集群 一、DockerCompose 1.1 基本介绍 DockerCompose&#xff1a;可以基于Compose文件帮我们快速部署分布式应用&#xff0c;而…

Mysql int(11)和Oracles nubmer(11) 的区别

先说Mysql int(11)到底代表什么意思 这里的int(11)不是表示限制int的长度为11&#xff0c;而是字符的显示宽度&#xff0c;在字段类型为int时&#xff0c;无论你显示宽度设置为多少&#xff0c;int类型能存储的最大值和最小值永远都是固定的 那么这个显示宽度到底有什么用呢&am…

vue项目中,js代码动态控制网页的link标签与title内容

最近正在开发一个微模块系统&#xff0c;产品想要根据子系统的不同&#xff0c;动态生成link标签与title中的内容&#xff0c;于是就做了一个简单的demo&#xff0c;希望分享出来给到后续有同样需求的伙伴&#xff0c;共勉。 首先肯定是需要有一套**.svg**的图标来对应相应的系…

Blender 纹理绘制

文章目录简介.进入纹理绘制.笔刷.自由线.模糊.涂抹.克隆.填充.遮罩.保存绘制好的纹理.简介. 1 纹理绘制允许我们直接在图片上画出图案 2 要求模型必须已经展开UV 进入纹理绘制. 1 左上角视窗类型里选择 3D视图/纹理绘制 笔刷. 自由线. 1 纹理&#xff1a;如果使用的是程…

Docker[6]-.DockerCompose

1 DockerCompose介绍 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;您可以使用 YML 文件来配置应用程序需要的所有服务。然后&#xff0c;使用一个命令&#xff0c;就可以从 YML 文件配置中创建并启动所有服务。 一键启动所有的服务 Docker…

MySQL基础知识

一、数据库相关的简单命令 1、显示数据库 show databases&#xff1b; 2、创建数据库 create database 数据库名 character set 字符集 collate 指定字符集的校验规则&#xff1b; 注意&#xff1a; 数据库名应尽量避免使用关键字&#xff0c;如必须使用则需添加(倒引号);未…

欧洲的历史都经历了哪些时代?

欧洲历史起源于古希腊和罗马&#xff0c;后面分化出了法、意、德&#xff1b;经过罗马时代中世纪时期的黑暗后&#xff0c;欧洲觉醒出现文艺复兴&#xff0c;使欧洲开启了巨大的创造力。后面的大航海时代欧洲开始向外拓展势力范围&#xff0c;疯狂殖民&#xff0c;英国成为最大…

初级测试工程师(能找到工作的水平就行)1、学多久2、学什么?

看到这个主题&#xff0c;我认为自己还有点发言权吧。 我是普通二本院校的垫底学渣&#xff0c;全班成绩倒数第三&#xff0c;并且还是非计算机专业。现在毕业2年&#xff0c;从销售岗位跨越式跳槽软件测试岗。当然我的薪资也已逆袭&#xff0c;从2k到17k。 踩过不少新手的坑…