-
2019-09-23 07:34:50更多相关内容
-
jdk9、jdk10、jdk11、jdk12、jdk13新特性
2019-10-28 09:03:22我们绝大部分人估计都还在用着jdk8,12其实是一个非LTS(long time support)版本,而11与8一样是LTS版,意味着下个通用的版本将从8直接到11,毕竟11包含了9和10的所有新特性,因此9和10估计就直接被废弃啦。...我们绝大部分人估计都还在用着jdk8,12其实是一个非LTS(long time support)版本,而11与8一样是LTS版,意味着下个通用的版本将从8直接到11,毕竟11包含了9和10的所有新特性,因此9和10估计就直接被废弃啦。不过9、10、11、12面向开发者的新特性其实并不是很多,大部分都是一些优化、收集器加强以及增加了一些新功能等等
而我们开发人员最为关注的肯定是对我们搬砖有用的特性,虽然可能还用不太上,但这边还是先记录一下从jdk9-12的新特性:
jdk9新特性
1、集合加强jdk9为所有集合(List/Set/Map)都增加了of和copyOf方法,用来创建不可变集合,即一旦创建就无法再执行添加、删除、替换、排序等操作,否则将报java.lang.UnsupportedOperationException异常。一般在特定场景下用还是可以的,不过如果引用了guava库的话推荐还是使用guava把hhhh,例子如下:
List strs = List.of("Hello", "World");
List strsCopy = List. copyOf(strs);
Set strs = Set.of("Hello", "World");
Map maps = Map.of("Hello", 1, "World", 2);
2、私有接口方法jdk8提供了接口的默认方法(default)和静态方法,打破了之前接口只能定义方法而不能存在行为。jdk9则是允许接口定义私有方法,私有方法可以作为通用方法放在默认方法中调用,不过实际中并无多大用处,至少对我来说。
3、垃圾收集机制
jdk9把G1作为默认的垃圾收集器实现,替换了jdk7和jdk8的默认垃圾收集器实现:Parallel Scavenge(新生代)+Parallel Old(老年代)。
4、I/O流加强
java.io.InputStream 中增加了新的方法来读取和复制 InputStream 中包含的数据:
readAllBytes:读取 InputStream 中的所有剩余字节
readNBytes: 从 InputStream 中读取指定数量的字节到数组中
transferTo:读取 InputStream 中的全部字节并写入到指定的 OutputStream 中
5、JShell工具
jdk9引入了jshell这个交互性工具,让Java也可以像脚本语言一样来运行,可以从控制台启动 jshell ,在 jshell 中直接输入表达式并查看其执行结果。当需要测试一个方法的运行效果,或是快速的对表达式进行求值时,jshell 都非常实用。举个例子:
jdk10新特性
1、局部变量类型推断局部变量类型推断可以说是jdk10中最值得注意的特性,这是Java语言开发人员为了简化Java应用程序的编写而采取的又一步,举个例子:
原先我们需要这么定义一个list
List<String> list = new ArrayList<>();
使用局部类型推断var关键词定义var list = new ArrayList<String>();
不过局部变量类型推断仅仅适用在:有初始化值的局部变量
增强 for 循环中的索引
传统 for 循环中声明的局部变量
Oracle 的 Java 团队申明,以下不支持局部变量类型推断:
方法参数
构造函数参数
方法返回类型
字段
catch 代码块(或任何其他类型的变量声明)
2、线程本地握手
jdk10将引入一种在线程上执行回调的新方法,因此这将会很方便能停止单个线程而不是停止全部线程或者一个都不停。说实话并不是很懂是什么意思...
3、GC改进和内存管理
jdk10中有2个JEP专门用于改进当前的垃圾收集元素。
第一个垃圾收集器接口是(JEP 304),它将引入一个纯净的垃圾收集器接口,以帮助改进不同垃圾收集器的源代码隔离。
预定用于Java 10的第二个JEP是针对G1的并行完全GC(JEP 307),其重点在于通过完全GC并行来改善G1最坏情况的等待时间。G1是Java 9中的默认GC,并且此JEP的目标是使G1平行。
jdk11新特性
1、字符串加强// 判断字符串是否为空白
" ".isBlank(); // true
// 去除首尾空格
" Javastack ".strip(); // "Javastack"
// 去除尾部空格
" Javastack ".stripTrailing();
// 去除首部空格
" Javastack ".stripLeading(); // "Javastack "
// 复制字符串
"Java".repeat(3); // "JavaJavaJava"
// 行数统计
"A\nB\nC".lines().count(); // 3
2、HttClient Api这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在java.net包中找到这个 Api
3、用于 Lambda 参数的局部变量语法
用于 Lambda 参数的局部变量语法简单来说就是支持类型推导:
var x = new A();
for (var x : xs) { ... }
try (var x = ...) { ... } catch ...
4、ZGC从JDK 9开始,JDK使用G1作为默认的垃圾回收器。G1可以说是GC的一个里程碑,G1之前的GC回收,还是基于固定的内存区域,而G1采用了一种“细粒度”的内存管理策略,不在固定的区分内存区域属于surviors、eden、old,而我们不需要再去对于年轻代使用一种回收策略,老年代使用一种回收策略,取而代之的是一种整体的内存回收策略。这种回收策略在我们当下cpu、内存、服务规模都越来越大的情况下提供了更好的表现,而这一代ZGC更是有了突破性的进步。
从原理上来理解,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为"Stop the world"。只有当整理完成后,线程逻辑才可以继续运行,一般而言,主要有如下几种方式优化"Stop the world":
使用多个线程同时回收(并行回收)
回收过程分为多次停顿(增量回收)
在程序运行期间回收,不需要停顿或只停顿很短时间(并发回收)
只回收内存而不整理内存
ZGC主要采用的是并发回收的策略,相较于G1 ZGC最主要的提升是使用Load Barrier技术实现,引用R大对于ZGC的评价:与标记对象的传统算法相比,ZGC在指针上做标记,在访问指针时加入Load Barrier(读屏障),比如当对象正被GC移动,指针上的颜色就会不对,这个屏障就会先把指针更新为有效地址再返回,也就是,永远只有单个对象读取时有概率被减速,而不存在为了保持应用与GC一致而粗暴整体的Stop The World。
jdk12新特性
1、Switch Expressions这是一个为开发者准备的特性,我们可以利用具体代码快速了解一下,下面是传统 statement 形式的 switch 语法:
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
}
如果有编码经验,你一定知道,switch 语句如果漏写了一个 break,那么逻辑往往就跑偏了,这种方式既繁琐,又容易出错。如果换成 switch 表达式,Pattern Matching 机制能够自然地保证只有单一路径会被执行,请看下面的代码示例:switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
更进一步,下面的表达式,为我们提供了优雅地表达特定场合计算逻辑的方式int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
Switch Expressions 或者说起相关的 Pattern Matching 特性,为我们提供了勾勒出了 Java 语法进化的一个趋势,将开发者从复杂繁琐的低层次抽象中逐渐解放出来,以更高层次更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质量和开发效率。2、Shenandoah GC
新增了一个名为 Shenandoah 的 GC 算法,通过与正在运行的 Java 线程同时进行 evacuation 工作来减少 GC 暂停时间。使用 Shenandoah 的暂停时间与堆大小无关,这意味着无论堆是 200 MB 还是 200 GB,都将具有相同的暂停时间。
JDK13新特性JDK13于9月17日正式发布。目前该版本包含的特性已经全部固定,主要包含以下五个:
下面来逐一介绍下这五个重要的特性。
Dynamic CDS Archives
这一特性是在JEP310:Application Class-Data Sharing基础上扩展而来的,Dynamic CDS Archives中的CDS指的就是Class-Data Sharing。
那么,这个JEP310是个啥东西呢?
我们知道在同一个物理机/虚拟机上启动多个JVM时,如果每个虚拟机都单独装载自己需要的所有类,启动成本和内存占用是比较高的。所以Java团队引入了CDS的概念,通过把一些核心类在每个JVM间共享,每个JVM只需要装载自己的应用类,启动时间减少了,另外核心类是共享的,所以JVM的内存占用也减少了。
CDS 只能作用于 Boot Class Loader 加载的类,不能作用于 App Class Loader 或者自定义的 Class Loader 加载的类。
在 Java 10 中,则将 CDS 扩展为 AppCDS,顾名思义,AppCDS 不止能够作用于 Boot Class Loader了,App Class Loader 和自定义的 Class Loader 也都能够起作用,大大加大了 CDS 的适用范围。也就说开发自定义的类也可以装载给多个JVM共享了。
Java 10中包含的JEP310的通过跨不同Java进程共享公共类元数据来减少了内存占用和改进了启动时间。
但是,JEP310中,使用AppCDS的过程还是比较复杂的,需要有三个步骤:
这一次的JDK 13中的JEP 350 ,在JEP310的基础上,又做了一些扩展。允许在Java应用程序执行结束时动态归档类,归档类将包括默认的基础层 CDS(class data-sharing)存档中不存在的所有已加载的应用程序类和库类。也就是说,在Java 13中再使用AppCDS的时候,就不在需要这么复杂了。
ZGC: Uncommit Unused Memory
在讨论这个问题之前,想先问一个问题,JVM的GC释放的内存会还给操作系统吗?
GC后的内存如何处置,其实是取决于不同的垃圾回收器的。因为把内存还给OS,意味着要调整JVM的堆大小,这个过程是比较耗费资源的。
在JDK 11中,Java引入了ZGC,这是一款可伸缩的低延迟垃圾收集器,但是当时只是实验性的。并且,ZGC释放的内存是不会还给操作系统的。
而在Java 13中,JEP 351再次对ZGC做了增强,本次 ZGC 可以将未使用的堆内存返回给操作系统。之所以引入这个特性,是因为如今有很多场景中内存是比较昂贵的资源,在以下情况中,将内存还给操作系统还是很有必要的:
1、那些需要根据使用量付费的容器
2、应用程序可能长时间处于空闲状态并与许多其他应用程序共享或竞争资源的环境。
3、应用程序在执行期间可能有非常不同的堆空间需求。例如,启动期间所需的堆可能大于稍后在稳定状态执行期间所需的堆。
Reimplement the Legacy Socket API
使用易于维护和调试的更简单、更现代的实现替换 java.net.Socket 和 java.net.ServerSocket API。
java.net.Socket和java.net.ServerSocket的实现非常古老,这个JEP为它们引入了一个现代的实现。现代实现是Java 13中的默认实现,但是旧的实现还没有删除,可以通过设置系统属性jdk.net.usePlainSocketImpl来使用它们。
运行一个实例化Socket和ServerSocket的类将显示这个调试输出。这是默认的(新的).
上面输出的sun.nio.ch.NioSocketImpl就是新提供的实现。如果使用旧的实现也是可以的(指定参数jdk.net.usePlainSocketImpl):
上面的结果中,旧的实现java.net.PlainSocketImpl被用到了。Switch Expressions (Preview)
在JDK 12中引入了Switch表达式作为预览特性。JEP 354修改了这个特性,它引入了yield语句,用于返回值。这意味着,switch表达式(返回值)应该使用yield, switch语句(不返回值)应该使用break。
在以前,我们想要在switch中返回内容,还是比较麻烦的,一般语法如下:
在JDK13中使用以下语法:
或者
在这之后,switch中就多了一个关键字用于跳出switch块了,那就是yield,他用于返回一个值。和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块。Text Blocks (Preview)
在JDK 12中引入了Raw String Literals特性,但在发布之前就放弃了。这个JEP在引入多行字符串文字(text block)在意义上是类似的。
text block,文本块,是一个多行字符串文字,它避免了对大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。
我们以前从外部copy一段文本串到Java中,会被自动转义,如有一段以下字符串:
将其复制到Java的字符串中,会展示成以下内容:使用“”“作为文本块的开始符合结束符,在其中就可以放置多行的字符串,不需要进行任何转义。看起来就十分清爽了。
如常见的SQL语句:
看起来就比较直观,清爽了。JDK13中包含的5个特性,能够改变开发者的编码风格的主要有Text Blocks和Switch Expressions两个新特性,但是这两个特性还处于预览阶段。
而且,JDK13并不是LTS(长期支持)版本,如果你正在使用Java 8(LTS)或者Java 11(LTS),暂时可以不必升级到Java 13.
-
jdk1.8新特性
2018-03-13 11:30:56JDK1.8新特性简介剖析,仅做参考,希望大家相互学习 作为Comparator 和Runnable早期的证明,在JDK中已经定义的接口恰巧作为函数接口而与lambdas表达式兼容。同样方式可以在你自己的代码中定义任何函数接口或第三方... -
高版本JDK13新特性以及与JDK8对比
2021-03-27 10:42:03文章目录一、关于JRE二、关于Java运行 一、关于JRE · JDK8在下载安装完成后会弹出安装JRE的窗口,单独安装JRE。同时安装目录中除了JDK安装文件夹还有JRE文件夹。...· JDK13可以直接java后面直接加j.文章目录
一、关于JRE
· JDK8在下载安装完成后会弹出安装JRE的窗口,单独安装JRE。同时安装目录中除了JDK安装文件夹还有JRE文件夹。相当于JRE有两份,JDK中自带一份JRE,还有单独的JRE。
· JDK13在安装时不会单独安装JRE,直接安装完成,也不会生成单独的JRE文件夹。
二、关于Java运行
· JDK8运行时先使用“javac 源文件路径”编译,生成.class文件,再使用“java 类名”运行。
· JDK13可以直接java后面直接加java源文件的路径。
这个特性是为了简化开发而提出,但实际上底层的实现原理还是和以前一样的,以上命令在执行过程中,还是会先进行编译,然后再运行。并且以上的运行方式,编译生成的class文件在硬盘上不存在,看不到。 -
JDK8 新特性学习.rar
2020-01-19 16:31:28如果你不会JDK1.8的新特性,这部资料绝对物超所值,里面有JDK1.8新特性的入门文档,还有自己整理的性能对比等给同事学习分享笔记,看完学习稍微实践一下,就可以完成入门到上手了,纯干货,5分不贵哈。 -
尚硅谷JDK1.8 新特性 培训PPT
2018-05-15 11:02:14视频教程地址:http://www.gulixueyuan.com/course/56 -
JDK8有一些我们最常用的新特性
2020-11-11 22:16:28这个资源包括了我们在实际项目开发过程中最常用的一些JDK8的新特性,比如Stream流是如何使用的,当然资源里的案例都是非常基础的,加上了一些通俗易懂的描述,有兴趣的可以下载看一看哦! -
jdk1.8新特性.doc
2020-04-01 13:23:33本文主要介绍了JDK1.8版本中的一些新特性,仅供参考。 jdk1.8新特性知识点: 1、Lambda表达式 2、函数式接口 3、方法引用和构造器调用 4、Stream API 5、接口中的默认方法和静态方法 6、新时间日期API -
JDK5,JDK8新特性.ppt .ppt
2022-01-03 12:20:05参考使用,欢迎下载 -
JDK8新特性——Stream.pdf
2020-08-06 08:46:20借鉴前人经验,在经过不断实践之后,将Strean流部分方法整理成适合于自身需要的文档,供大家借鉴分享。 -
jdk8新特性.zip
2019-09-29 15:44:41JDK1.8已经发布很久了,在很多企业中都已经在使用。并且Spring5、SpringBoot2.0都推荐使用JDK1.8以上版本...Java8新特性如下: Lambda表达式 函数式接口 方法引用 接口的默认方法和静态方法 Optional Streams 并行数组 -
JDK8十大新特性详解
2016-02-23 10:45:05JDK8十大新特性详解,仅做参考,希望大家相互学习 -
Java基础之JDK13新特性之TextBlock文本块的使用理解
2019-09-25 10:58:07JDK13新特性之TextBlock文本块的使用理解 文本块 这个特性对我们的帮助的确太大了,点赞!!! 之前的写法的中,我们一般使用如下形式拼接较长的字符串。 String sql = " SELECT " + " t.* " + " FROM user...JDK13新特性之TextBlock文本块的使用理解
文本块
这个特性对我们的帮助的确太大了,点赞!!!
之前的写法的中,我们一般使用如下形式拼接较长的字符串。
String sql = " SELECT " + " t.* " + " FROM user t"; String html = "<html>" + " <head></head>" + " <body>" + " <font color='red'>测试字符</font>" + " </body>" + "</html>"; // JEP326使用**`**这个符号 String html = `<html> <body> <p>Hello World.</p> </body> </html> `;
而新的文本块使用
"""
这个符号,进行拼接。新版本文本块特性的目标:
- 简化表达多行字符串,不需要转义;
- 增强可读性;
// JDK13的写法 String sql13 = """ SELECT t.* FROM user t """; String html13 = """ <html> <head></head> <body> <font color='red'>测试字符</font> </body> </html> """;
Github示例代码仓库 麻烦喜欢的老铁给个星星!
-
jdk8新特性demo
2020-01-15 15:32:51jdk8新特性演示demo,主要包含lambda表达式的使用,方法引用的使用,stream流式操作的使用等演示demo,然后就么有了 -
JDK13的新特性之AppCDS详解
2020-08-19 05:25:26AppCDS的全称是Application Class-Data Sharing。主要是用来在不同的JVM中共享Class-Data信息,从而提升应用程序的启动速度。这篇文章主要介绍了JDK13的新特性:AppCDS详解,需要的朋友可以参考下 -
jdk1.8 新特性
2018-07-27 17:43:311.8 新特性 1. 速度更快 – 红黑树 2. 代码更少 – Lambda 3. 强大的Stream API – Stream 4. 便于并行 – Parallel 5. 最大化减少空指针异常 – Optional -
jdk11、12、13、14面向开发者的新特性
2019-03-28 20:48:58jdk13新特性 前言 前两天jdk12如约而至发布了,而我们绝大部分人估计都还在用着jdk8,12其实是一个非LTS(long time support)版本,而11与8一样是LTS版,意味着下个通用的版本将从8直接到11,毕竟11包含了9和10的... -
JDK8新特性
2020-01-14 10:44:01JDK8是Java升级变化最大的一个版本,JDK8引入很多新的写法,比如函数式接口、Lambda表达式、Stream函数式操作流元素集合、接口的默认方法、接口的静态方法等。 JDK8是Java升级变化最大的一个版本,JDK8引入很多新的... -
JDK14新特性之switch表达式的实现
2020-08-19 05:42:20主要介绍了JDK14新特性之switch表达式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
JDK13的新特性
2019-09-16 09:15:58Java Development Kit(JDK)13是标准Java的下一个版本,现在可作为候选版本使用,所有新功能都已锁定。为JDK 13提出的一项功能,但从未添加到官方列表中,用于打包自包含Java应用程序的jpackage工具,已经错过了... -
jdk1.8 新特性.docx
2020-05-27 14:58:55jdk1.8新特性知识点: Lambda表达式 函数式接口 *方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API -
深入浅析JDK8新特性之Lambda表达式
2020-09-01 08:21:55Lambda表达式主要是替换了原有匿名内部类的写法,也就是简化了匿名内部类的写法。这篇文章主要介绍了JDK8新特性之Lambda表达式,非常不错感兴趣的朋友参考下吧 -
JDK1.6新特性说明.doc
2022-04-12 18:59:24JDK1.6新特性说明.doc -
JDK各个版本的特性分析|JDK7|JDK8|JDK9|JDK10|JDK11|JDK12|JDK13特性分析
2019-10-09 20:38:37一、前言 在我们还在用jdk7的时候,jdk一言不合的就已经升级到jdk13了,还有一些年代久远的祖传项目甚至还在用jdk5,jdk6的,所以我决定是时候写一点文章来专门的总结一下...这里先放一些大佬们总结过的jdk特性,... -
jdk6新特性介绍
2019-03-28 02:09:07NULL 博文链接:https://strength-java.iteye.com/blog/1244812 -
JAVA JDK8 新特性代码详细讲解
2019-07-25 11:33:09JAVA8新特性代码讲解和学习 包括流代码和操作 及最新知识点讲解 非常详细 -
JDK10新特性之var泛型和多个接口实现方法
2020-08-19 04:56:11主要介绍了JDK10的新特性:var泛型和多个接口实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 -
19年全新JDK8~JDK13全套新特性视频教程java教程lambda函数式编程
2021-06-16 09:37:414)玩转JDK9/10/11/12/13 涵盖新特性 Jshell实战、接口私有方法、增强版try-with-resource、增强版 Stream API 5)局部类型推断Var实战、标准版HttpClient玩转GET/POST/异步/http2请求、多行文本块、增强版Switch 等...