Java 11是自Java 8以来的又一个LTS版本,是目前全球使用最多的LTS版本之一。下边我们看一下JAVA11的新特性

字符串API增强

在Java 11中,针对String的操作进一步得到加强。避免我们在很常见的场景中引入额外的、复杂的API。

isBlank()
用来判断字符串是不是空字符"“或者trim()之后(” ")为空字符:

String blankStr = "    ";// trueboolean trueVal = blankStr.isBlank();

lines()
将一个字符串按照行终止符(换行符\n或者回车符\r)进行分割,并将分割为Stream流:

         String newStr = "Hello Java 11 \n felord.cn \r 2021-09-28";​Stream<String> lines = newStr.lines();lines.forEach(System.out::println);
// Hello Java 11 // 张三李四周吴郑王 // 2022-18-44

strip()
去除字符串前后的“全角和半角”空白字符:

 String str = "HELLO\u3000";// str = 6System.out.println("str = " + str.length());// trim = 6System.out.println("trim = " + str.trim().length());// strip = 5System.out.println("strip = " + str.strip().length());

从上面也看出来了差别,trim()只能去除半角空白符。
strip()方法还有两个变种,stripLeading()用来去除前面的全角半角空白符;stripTrailing()用来去除尾部的全角半角空白符。

repeat(n)
按照给定的次数重复串联字符串的内容:

 String str = "HELLO";// 空字符String empty = str.repeat(0);// HELLOString repeatOne = str.repeat(1);// HELLOHELLOString repeatTwo = str.repeat(2);

集合转对应类型的数组
之前想集合转对应的数组很麻烦,要么用迭代;要么用Stream流,现在你可以这样:

         List<String> sampleList = Arrays.asList("张三", "java 11");// array = {"张三", "java 11"};String[] array = sampleList.toArray(String[]::new);

断言取反
java.util.function.Predicate是我们很常用的断言谓词函数。在以前取反我们得借助于!符号,到了Java 11我们可以借助于其静态方法not来实现,这样语义就更加清晰了:

      List<String> sampleList = Arrays.asList("张三", "java 11","jack");// [jack]List<String> result = sampleList.stream()// 过滤以j开头的字符串.filter(s -> s.startsWith("j"))// 同时不包含11的字符串.filter(Predicate.not(s -> s.contains("11"))).collect(Collectors.toList());

var可以用于修饰Lambda局部变量
在Java 10中引入的var来进行类型推断。在Java 10中它不能用于修饰Lambda表达式的入参,其实对于一个Lambda表达式来说它入参的类型其实是可以根据上下文推断出来的。拿上面的例子来说,s -> s.startsWith(“j”)中的s肯定是字符串类型,因此在Java 11中var可以用于修饰Lambda局部变量:

   List<String> sampleList = Arrays.asList("张三", "java 11","jack");List<String> result = sampleList.stream()// 过滤以j开头的字符串.filter((@NotNull var s) -> s.startsWith("j"))// 同时不包含11的字符串.filter(Predicate.not((@NotNull var s) -> s.contains("11"))).collect(Collectors.toList());

如果我们不声明var就没有办法为输入参数添加@NotNull注解。

文件中读写字符串内容更方便
Java 11中可以更轻松地从文件中读取和写入字符串内容了,我们可以通过Files工具类提供的新的静态方法readString和writeString分别进行读写文件的字符串内容,放在之前老麻烦了,特别是对IO流不熟悉的同学来说。现在简单几行就搞定了:

        String dir= "C://yourDir/hello.txt";
// 写入文件Path path = Files.writeString(Path.of(dir), "hello java 11");
// 读取文件String fileContent = Files.readString(path);// hello java 11System.err.println(fileContent);

嵌套类的访问控制规则
Java 11之前,内部嵌套类访问外部类的私有属性和方法是可行的:

public class Outer {private int outerInt;class Inner {public void printOuterField() {System.out.println("Outer field = " + outerInt);}}
}

但是如果你通过反射API实现内部类访问外部类的私有属性和方法就会抛出IllegalStateException异常。Java 11 修复了反射不能访问的问题.

JVM 访问规则不允许嵌套类之间进行私有访问。我们能通过常规方式可以访问是因为 JVM 在编译时为我们隐式地创建了桥接方法。Java 11 中引入了两个新的属性:一个叫做 NestMembers 的属性,用于标识其它已知的静态 nest 成员;另外一个是每个 nest 成员都包含的 NestHost 属性,用于标识出它的 nest 宿主类。在编译期就映射了双方的寄宿关系,不再需要桥接了。

HttpClient支持HTTP2
Java 9 引入了一个新的酝酿中的 HttpClient API 来处理 HTTP 请求。从 Java 11开始,这个API 现在是最终版本,可以在标准库包 java.net 中使用。让我们来实验一下这个 API 能做些什么。

var request = HttpRequest.newBuilder().uri(URI.create("https://baidu.com")).GET().build();var client = HttpClient.newHttpClient();HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());
// <html>
// <head><title>302 Found</title></head>
// <body bgcolor="white">
// <center><h1>302 Found</h1></center>
// <hr><center>bfe/1.0.8.18</center>
// </body>
// </html>

同样的请求可以异步执行。调用 sendAsync 不会阻塞当前线程,而是返回一个CompletableFuture 来构建异步操作管道。

var request = HttpRequest.newBuilder().uri(URI.create("https://baidu.com")).build();
var client = HttpClient.newHttpClient();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(System.out::println);

数据流 Streams
流是在 Java 8 中引入的,现在增加了三个新方法。Stream.ofNullable 从单个元素构造流:

Stream.ofNullable(null).count()   // 0

dropWhile 和 takeWhile 方法都接受一个谓词来决定从流中放弃或选用哪些元素

Stream.of(1, 2, 3, 2, 1).dropWhile(n -> n < 3).collect(Collectors.toList());  // [3, 2, 1]Stream.of(1, 2, 3, 2, 1).takeWhile(n -> n < 3).collect(Collectors.toList());  // [1, 2]

Optionals
Optionals 增加了非常方便的新方法,例如,你现在可以简单地将 Optionals 转换为流,或者提供另一个 Optionals 作为空 Optionals 的回调

Optional.of("foo").orElseThrow();     // foo
Optional.of("foo").stream().count();  // 1
Optional.ofNullable(null).or(() -> Optional.of("fallback")).get();     

Epsilon垃圾收集器
JDK上对这个特性的描述是:开发一个处理内存分配但不实现任何实际内存回收机制的GC,一旦可用堆内存用完,JVM就会退出。我们可以来尝试着使用一下它,首先我们编写一段程序:

public class EpsilonTest {public static void main(String[] args) throws Exception {var list = new ArrayList<>();boolean flag = true;int count = 0;while (flag) {list.add(new Garbage());if (count++ == 500) {list.clear();}}}
}class Garbage {private double d1 = 1;private double d2 = 2;/*** GC在清除本对象时会调用该方法*/@Overrideprotected void finalize() throws Throwable {System.out.println(this + " collecting");}
}

这是一个无限循环的程序,循环体不断创建Garbage对象并放入集合,当循环次数达到500时将集合清空,此时的500个对象均为垃圾,会被GC清理,清理时调用finalize()方法打印信息。运行这段程序,结果如下:

...
com.itcast.Garbage@1e9c634c collecting
java.lang.OutOfMemoryError: Java heap spaceat com.itcast.EpsilonTest.main(EpsilonTest.java:11)
com.itcast.Garbage@1174213e collecting
com.itcast.Garbage@2029a4b8 collecting
...

当程序执行到某一刻时,内存溢出,程序终止。现在我们来使用一下Epsilon,启动参数: UnlockExperimentalVMOptions:解锁隐藏的虚拟机参数。

-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xms100m -Xmx100m

运行程序后,结果如下:

程序开始
Terminating due to java.lang.OutOfMemoryError: Java heap space

会发现,控制台只输出了这么一句,说明被清除的集合中的对象并没有被回收,而且内存溢出的速度也非常快,这说明该GC是并不会回收垃圾,那么它有什么作用呢?它提供完全被动的GC实现,具有有限的分配限制和尽可能低的延迟开销,但代价是内存占用和内存吞吐量,它的主要用途有以下几个方面:

  • 性能测试(它可以帮助过滤掉GC引起的性能假象)
  • 内存压力测试
  • 非常短的JOB任务
  • VM接口测试

ZGC垃圾回收器
据说这是JDK11最为瞩目的特性,没有之一,是最重磅的升级,那么ZGC的优势在哪里呢?

  • GC暂停时间不会超过10毫秒
  • 既能处理几百兆的小堆,也能处理几个T的大堆
  • 和G1相比,应用吞吐能力不会下降超过15%
  • 为未来的GC功能和利用colord指针以及Load barriers优化奠定了基础

ZGC是一个并发、基于region、压缩型的垃圾收集器,只有root扫描阶段会STW(strop the world,停止所有线程),因此ZGC的停顿时间不会随着堆的增长和存活对象的增长而变长。用法:-XX:UnlockExperimentalVMOptions -XX:+UseZGC虽然功能如此强大,但很遗憾的是,在Windows系统的JDK中并没有提供ZGC,所以也就没有办法测试了

Java11新特性一览相关推荐

  1. Java8-19新特性一览 ,认识全新的前沿技术

    文章目录 Java8-19新特性一览 ,认识全新的前沿技术 前言 你的收获 Java发展趋势 准备工作 新特性 1.接口private 1).说明 2).案例 3).注意 2.类型推断 1).说明 2 ...

  2. 深入解析 | Oracle Database 20c 十大新特性一览

    在2020年2月14日,Oracle 正式宣布在 Oracle Cloud 发布 Database 20c 的预览版,同时发布了所有的官方文档. 为了和大家及时分享关于 Oracle 20c 引人瞩目 ...

  3. Java11新特性(一)——JDK11新特性概述

    序言 关于JDK11,自从去年也就是2018年9月份 Oracle 对外公布--JDK11正式发布以来,博主就跃跃欲试,但是由于项目周期时间紧,一直未果,今年,也就是2019年2月底系统正式上线,博主 ...

  4. Java11新特性(二)——JDK11绿色免安装版环境变量配置教程

    前言 在实际的工作环境中,因为资源有限,一个人在公司,不可能配备多台电脑,所以就不可能有多个环境,但是一个人可能存在于多个项目,例如:在公司里面,尤其在一个大型的国企里面,研发产品生产线有很多条,当研 ...

  5. java11 新特性 详解

    为什么80%的码农都做不了架构师?>>>    引言: 点击-->java10 新特性 详解 点击-->java9 新特性 详解 点击-->java8 新特性 详解 ...

  6. 【机器学习】scikit-learn 1.0 版本重要新特性一览

    1 简介 就在几天前,著名的机器学习框架scikit-learn在pypi上释放了其1.0rc1版本,这里给大家科普一下,版本号中的rc是Release Candidate的简称,代表当前的版本是一个 ...

  7. Java11 新特性

    Java 11新特性的详细解释.JDK 11已经于 2018年9月25日正式发布,那么Java 11主要包含哪些新特性呢? JDK 11是Java SE 11平台版本11的开源参考实现,由JSR 38 ...

  8. Oracle Database 20c 十大新特性一览

    从大会的分享和公布的资料中,我们整理了其中重要的新特性,汇聚成10个方向,按照惯例,和大家分享. 历史回顾: Oracle Database 20c 新特性: 1.原生的区块链支持 - Native ...

  9. Java11新特性概览

    一.JShell(java9已经开始支持) 1.类似于python中的求值-打印循环(Read-Evaluaction-Print Loop),目的在与即时结果和反馈 2.java9引入了shell这 ...

最新文章

  1. Rust 数据类型介绍
  2. in an effort to
  3. 花之吻自己查错误订单的一个小脚本
  4. Linux: centOS6.5 RabbitMQ
  5. Springboot04整合Druid
  6. Python使用Manager对象实现不同机器上的进程跨网络传输数据
  7. Prototype使用$A()函数
  8. python生活中的小问题_python日常注意小知识集锦
  9. 使用flutter控制蓝牙通讯_使用Flutter控制蓝牙通讯
  10. 邯郸三中高考2021成绩查询,邯郸2021年中考统考成绩
  11. 暗影精灵 6 Plus 快速上手 大量游戏实测
  12. 浏览器中访问本地文件for mac
  13. 使用视频作为网页背景的写法
  14. 四阶龙格库塔法求解一次常微分方程组(python实现)
  15. 肺实质分割matlab实现
  16. 到此一游:在微软参加Visual C++深度体验圆桌会议
  17. cscript和wscript之间的区别
  18. 怎么节省PayPal收款手续费?
  19. JSP: 使用网易邮箱发送带附件的电子邮件
  20. linux 终端 分享,11个实用的Linux终端命令总结分享

热门文章

  1. 一文看懂js中元素偏移量(offsetLeft,offsetTop,offsetWidth,offsetHeight)
  2. C语言:位、字节、字之间的关系
  3. 【电量计芯片】鼎盛合分享手机电量显示电量芯片技术
  4. input框中使用oninput属性限制输入内容
  5. C语言中的void类型函数
  6. Java线程状态完全解析教程
  7. 做小生意卖什么赚钱,来看看这5种赚钱方法!
  8. Elasticsearch 聚合之 Terms
  9. Python-Django毕业设计公立医院绩效考核系统(程序+Lw)
  10. TDD测试驱动开发的基础是什么?