JDK17都出了,学点JDK11新特性
JDK8 - 转- JDK11 -转- JDK17
JShell(JDK9开始支持)
G:\dowload\JDK\JDK11\jdk-11.0.2\bin ===> C:\Windows\System32\cmd.exe
var 局部变量的类型推导
var 不可以作用修饰成员变量。注意var不是关键字,仅仅是语法的改进。
int var = 100;//是有效的
var不是关键字,注意var推断的是接收变量的类型,如果接收变量未定义,那么无效且编译不通过!
var a;//不成立,编译不通过,因为无法推断!
JDK1.7开始的:
List list = new ArrayList<>();//左边的泛型依赖右边的泛型
JDK9开始:
var temp = "Hello World" ;
等价于
String temp = "Hello World" ;
var的最主要的用途一般是用于lambda表达式中!
(@NotNull var t,@NotNull var y)->t.eques(y);
JDK11新添加API
集合API增强
创建固定长度的集合
@Test
public void testList() {
String[] tempNumber = {"abc", "def", "ghi", "jkl", "mno", "pqr"};
//以前创建集合
List<String> stringByList01 = new ArrayList<>();
for (int i = 0; i < tempNumber.length; i++) {
stringByList01.add(tempNumber[i]);
}
System.out.println(stringByList01);
//第一次进阶
stringByList01 = new ArrayList<>(Arrays.asList(tempNumber));
//注意Arrays.asList返回的也不是util包下的ArrayList,是Arrays内部类名称也为ArrayList,两个不等同,所以不能添加新元素,异常:不支持操作异常
System.out.println(stringByList01);
//JDK11 List.of(...)
List<String> stringByList = List.of(tempNumber);
System.out.println(stringByList);
//stringByList.getClass() = > ImmutableCollections$ListN(不可改变的集合),返回的也不是util包下的ArrayList,也是不能添加新元素
}
同理set创建固定集合
@Test
public void tetSet(){
Set<Integer> integers = Set.of(123, 23, 43, 53, 65, 76, 73, 34, 54);
System.out.println(integers);
//注意,如果set的of方法里面有重复元素,直接抛异常
//IllegalArgumentException
integers = Set.of(123, 23, 43, 53, 65, 123, 23, 43, 53);
System.out.println(integers);
}
JDK11对于流的改进
@Test
public void streamTest() {
//Stream 流处理创建也是可以使用of方法
Stream<String> stream = Stream.of("5", "2", "1", "4");
//排序和打印
stream.sorted(String::compareTo).forEach(System.out::println);
//可以Stream.of(),但是不可以Stream.of(null);是空指针异常
//JDK11的有传入null的流的创建
Stream<Object> objectStream = Stream.ofNullable(null);
System.out.println(objectStream);
//JDK11的新方法takeWhile
Stream<Integer> integerStream = Stream.of(2, 4, 6, 7, 8);
//就是遍历判定是否满足条件,满足的放入新的流中,一旦遇到不满足的就即刻终止遍历
Stream<Integer> takeWhile = integerStream.takeWhile(t -> t % 2 == 0);
takeWhile.forEach(x -> System.out.print(x + ","));
System.out.println();
//JDK11的新方法dropWhile
Stream<Integer> dropWhileStream = Stream.of(2, 4, 6, 7, 8);
//就是遍历判定是否满足条件,不满足的丢弃,一旦遇到满足的就将它和他后面的元素丢入新的流中
Stream<Integer> dropWhile = dropWhileStream.dropWhile(t -> t % 2 == 0);
dropWhile.forEach(x -> System.out.print(x + ","));
//JDK8 流的无限流,迭代
Stream<Integer> iterate = Stream.iterate(1, t -> 2 * t + 1);
iterate.limit(10).forEach(x -> System.out.print(x + ","));
//JDK11 解决无限流,迭代:中间有一个条件终止无限流,转化为有限流
Stream<Integer> youxianliu = Stream.iterate(1, t -> t < 1000, t -> 2 * t + 1);
youxianliu.limit(10).forEach(x -> System.out.print(x + ","));
}
String增强API
@Test
public void stringTest() {
//JDK11字符串新增方法
String str = " \t \n";
//判断字符串是否为空白:
boolean blank = str.isBlank();
System.out.println(blank);
//JDK11.去除字符串首尾的空白:处理各种语言的空白字符
String strip = str.strip();// 原来的首尾ASCII码小于32的空格去除:str.trim(),
System.out.println(strip);
//去除尾部或者首部的空白
String index = str.stripLeading();
String last = str.stripTrailing();
// 判断字符串是否为空白
" ".isBlank(); // true
// 去除首尾空格
" Javastack ".strip(); // "Javastack"
// 去除尾部空格
" Javastack ".stripTrailing(); // " Javastack"
// 去除首部空格
" Javastack ".stripLeading(); // "Javastack "
// 复制字符串
"Java".repeat(3);// "JavaJavaJava"
// 行数统计
"A\nB\nC".lines().count(); // 3
}
Optional增强:Opthonal 也增加了几个非常酷的方法,现在可以很方便的将一个 Optional 转换成一个 Stream, 或者当一个空 Optional 时给它一个替代的。
//java ~
String res1 = Optional.of( "java ~" ).orElseThrow();
System.out.println(res1);
//1
long res2 = Optional.of( "java ~" ).stream().count();
System.out.println(res2);
//java ~
Object res3 = Optional.ofNullable( null )
.or( () -> Optional.of( "java ~" ) )
.get();
System.out.println(res3);
输入流增强api:
transferTo,可以用来将数据直接传输到OutputStream,这是在处理原始数据流时非常常见的一种用法。
try {
InputStream inputStream = TestInputStream.class.getClassLoader().getResourceAsStream("test.txt");
var file = new File("/Users/xxx/test2.txt");
try (var outputStream = new FileOutputStream(file)) {
inputStream.transferTo(outputStream);
}
} catch (IOException e) {
e.printStackTrace();
}
HTTP客户端增强api
这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 API。
try {
var request = HttpRequest.newBuilder()
.uri( URI.create("http://t.weather.sojson.com/api/weather/city/101020100"))
.GET()
.build();
var client = HttpClient.newHttpClient();
// 同步
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
//异步
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
} catch (Exception e) {
e.printStackTrace();
}
工作中异常:IOException, InterruptedException, ExecutionException
读写文件
对Files类增加了writeString和readString两个静态方法,可以直接把String写入文件,或者把整个文件读出为一个String:
Files.writeString(
Path.of("./", "tmp.txt"), // 路径
"hello, jdk11 files api", // 内容
StandardCharsets.UTF_8); // 编码
String s = Files.readString(
Paths.get("./tmp.txt"), // 路径
StandardCharsets.UTF_8); // 编码
JDK11还带来了EpsilonGC,就是什么也不做的GC,以及ZGC,一个几乎可以做到毫秒级暂停的GC。ZGC还处于实验阶段,所以启动它需要命令行参数
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
。
ZGC
ZGC, 这应该是JDK11最为瞩目的特性, 没有之一. 但是后面带了Experimental, 说明这还不建议用到生产环境。 GC暂停时间不会超过10ms,既能处理几百兆的小堆, 也能处理几个T的大堆(OMG),和G1相比, 应用吞吐能力不会下降超过15%,为未来的GC功能和利用colord指针以及Load barriers优化奠定基础,初始只支持64位系统 ZGC的设计目标是:支持TB级内存容量,暂停时间低(<10ms),对整个程序吞吐量的影响小于15%。 将来还可以扩展实现机制,以支持不少令人兴奋的功能,例如多层堆(即热对象置于DRAM和冷对象置于NVMe闪存),或压缩堆。 GC是java主要优势之一,当GC停顿太长, 就会开始影响应用的响应时间.消除或者减少GC停顿时长, java将对更广泛的应用场景是一个更有吸引力的平台. 此外, 现代系统中可用内存不断增长,用户和程序员希望JVM能够以高效的方式充分利用这些内存, 并且无需长时间的GC暂停时间
用法 : -XX:+UnlockExperimentalVMOptions –XX:+UseZGC, 因为ZGC还处于实验阶段, 所以需要通过JVM参数来解锁这个特性
完全支持Linux容器(包括Docker)
许多运行在Java虚拟机中的应用程序(包括Apache Spark和Kafka等数据服务以及传统的企业应用程序)都可以在Docker容器中运行。但是在Docker容器中运行Java应用程序一直存在一个问题,那就是在容器中运行JVM程序在设置内存大小和CPU使用率后,会导致应用程序的性能下降。这是因为Java应用程序没有意识到它正在容器中运行。随着Java 10的发布,这个问题总算得以解决,JVM现在可以识别由容器控制组(cgroups)设置的约束。可以在容器中使用内存和CPU约束来直接管理Java应用程序,其中包括:
遵守容器中设置的内存限制
在容器中设置可用的CPU
在容器中设置CPU约束
Java 10的这个改进在Docker for Mac、Docker for Windows以及Docker Enterprise Edition等环境均有效。
容器的内存限制
在Java 9之前,JVM无法识别容器使用标志设置的内存限制和CPU限制。而在Java 10中,内存限制会自动被识别并强制执行。Java将服务器类机定义为具有2个CPU和2GB内存,以及默认堆大小为物理内存的1/4。
支持G1上的并行完全垃圾收集对于 G1 GC,相比于JDK 8,升级到JDK 11即可免费享受到:并行的Full GC,快速的CardTable扫描,自适应的堆占用比例调整(IHOP),在并发标记阶段的类型卸载等等。这些都是针对G1的不断增强,其中串行Full GC等甚至是曾经被广泛诟病的短板,你会发现GC配置和调优在JDK11中越来越方便。
JDK17都出了,学点JDK11新特性的更多相关文章
- Jdk14 都要出了,Jdk9 的新特性还不了解一下?
Java 9 中最大的亮点是 Java 平台模块化的引入,以及模块化 JDK.但是 Java 9 还有很多其他新功能,这篇文字会将重点介绍开发人员特别感兴趣的几种功能. 这篇文章也是 Java 新特性 ...
- jdk11新特性
JDK 11主要特性一览 jdk11即将在9月25号发布正式版.确定的新特性包括以下17个 181 嵌套类可见性控制 309 动态文件常量 315 改进 Aarch64 Intrinsics 318 ...
- java都13了, 8的新特性你还没不会用吗
前言 java13都已经来了,很多同学还停留在使用java5的东西.如果在日常开发中没有使用上java8的一些新特性或者不会用.这篇文章对你可能有帮助. lambda表达式 介绍 lambda表达式是 ...
- JDK10、JDK11、JDK12新特性
JDK10新特性 1.var声明变量 很多人抱怨Java是一种强类型,需要引入大量的样板代码.甚至在这些情况下,给定好变量名,通常很清楚发生了什么,明显类型声明往往被认为是不必要的.许多流行的编程语言 ...
- DK1.5-JDK11各个新特性
摘要: 参考文献: https://blog.csdn.net/lsxf_xin/article/details/79712537 JDK各个版本的新特性 要了解一门语言,最好的方式就是要能从基础的版 ...
- 开发者所需要知道的 iOS 10 SDK 新特性
转自:https://onevcat.com/2016/06/ios-10-sdk/ 写的很好啊.哈哈哈 总览 距离 iPhone 横空出世已经过去了 9 个年头,iOS 的版本号也跨入了两位数.在我 ...
- 开发者必须知道的HTML5十五大新特性
HTML5想必大家都很熟悉了,因为太多的媒体在讨论这一技术.然而,你能准确地说出HTML5带来了哪些新特性吗?本文总结了HTML5带来的15项你必须知道的新特性. 一起来看下: 1.新的文档类型 ( ...
- HTML5十五大新特性
HTML5想必大家都很熟悉了.然而,你能准确地说出HTML5带来了哪些新特性吗?本文总结了HTML5带来的15项你必须知道的新特性. 一起来看下: 1.新的文档类型 (New Doctype) 目前 ...
- jdk1.8新特性总结
一.引言 jdk1.8出来已经一段时间了,现在1.9也已经出来了,但是很多公司(我们公司也一样)不太愿意升级到高版本的jdk,主要是有老的项目要维护,还有升级的话配套的框架也要升级,要考虑的细节事情太 ...
- 适应c++ 新特性 - 与我 - 多年传统方式开发(新特性参考微软标准:https://msdn.microsoft.com/zh-cn/library/hh279654.aspx)
公司同事都在积极使用c++的新特性,并对其赞不绝口,而自己一直做着传统的c++开发方式,到底这些新特性如何,又是怎么提高开发效率的,我依然在疑问当中,从同事的说法和实际代码操练里,确实在减少代码量,集 ...
随机推荐
- Windows Powershell 对于布尔值的处理
Windows PowerShell中有很多场景需要输入0或者1作为命令的参数.Powershell对于布尔值的逻辑处理究竟是怎样的呢?除了最常用的$True, $False, 1, 0.对于要求输入 ...
- Kibana:运用索引模式的 formatter 来探索 IP 信息
文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/107484674
- Prometheus Operator 对接 Thanos
文章转载自:https://jishuin.proginn.com/p/763bfbd56ae4 使用 Prometheus Operator 来进行监控,在 Prometheus 高可用的章节中也手 ...
- ProxySQL(12):禁止多路路由
文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9372447.html multiplexing multiplexing,作用是将语句分多路路由.开启了mu ...
- windows C++ 异常调用栈简析
楔子 以win11 + vs2022运行VC++ 编译观察的结果. 如果安装了Visual Studio 2022,比如安装在D盘,则路径: D:\Visual Studio\IDE\VC\Tools ...
- 编写HelloWorld并运行
1在任意地方右键点新建 2创建一个文本文档 3修改名字,改为HelloWorld.java 4打开文件扩展名,查看后缀 打开后再去看文件名后缀有没有.txt,如果有的话就不是java文件,把后缀的.t ...
- 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍
微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...
- laravel 报错 AUTH` failed: ERR Client sent AUTH, but no password is set
明明没有设置redis密码.访问时候却报错 在代码里面的databases.php 改成这样就可以了.predis新版也会有取不到passwor的时候.改成我截图那样也可以.他默认取的是default ...
- 在vue项目中禁用eslint
文章目录 1.在创建项目的时候不自动使用eslint 2.在package.json中删除所有的eslint,然后重新install 3.按照图片注释(亲测可用) 在使用eslin进行规则验证时,一点 ...
- 齐博x1标签实例:做模板组图单图无图混排的处理
代码如下, {qb:tag name="xxx" type="cms" rows="10"} {if ( count($rs['picurl ...