JDK10、JDK11、JDK12新特性
JDK10新特性
1、var声明变量
很多人抱怨Java是一种强类型,需要引入大量的样板代码。甚至在这些情况下,给定好变量名,通常很清楚发生了什么,明显类型声明往往被认为是不必要的。许多流行的编程语言都已经支持某种形式的局部变量类型推断:如C++ (auto), C# (var), Scala (var/val), Go (declaration with :=)等。
JDK10 可以使用var作为局部变量类型推断标识符,此符号仅适用于局部变量,增强for循环的索引,以及传统for循环的本地变量;它不能使用于方法形式参数,构造函数形式参数,方法返回类型,字段,catch形式参数或任何其他类型的变量声明。
标识符var不是关键字;相反,它是一个保留的类型名称。这意味着var用作变量,方法名或则包名称的代码不会受到影响;但var不能作为类或则接口的名字(但这样命名是比较罕见的,因为他违反了通常的命名约定,类和接口首字母应该大写)。
参考一下示例:
var str = "ABC"; //根据推断为 字符串类型
var l = 10L;//根据10L 推断long 类型
var flag = true;//根据 true推断 boolean 类型
var flag1 = 1;//这里会推断boolean类型。0表示false 非0表示true
var list = new ArrayList<String>(); // 推断 ArrayList<String>
var stream = list.stream(); // 推断 Stream<String>
2、移除javah
移除Native-Header Generation Tool (javah)
JDK10 从JDK中移除了javah 工具。该工具已被JDK8 (JDK-7150368)中添加javac高级功能所取代。此功能提供了在编译java源代码时编写本机头文件的功能,从而无需使用单独的工具。
3、IO流大家族添加charset参数
其它
JDK10中包含许多对JVM的优化:
- 将JDK多存储库合并为单存储库
- 并行Full GC 的G1
- 垃圾回收接口
- 应用数据共享
- 线程局部管控
- 基于实验JAVA 的JIT 编译器
- 备用内存设备上分配堆内存
JDK11新特性
Java的改进提议被称为JEP(JDK Enhancement Proposal 特性增强提议),JDK11是Java改为6月一版之后的第一个LTS版本。
1、HTTPClient转正
JDK9中便引入httpclient模块,但它在jdk.incubator.httpclient包下,在java11被标记为正式,改为java.net.http模块。
2、密码学方面的改进
- 使用RFC 7748中描述的Curve25519和Curve448实现key agreement
- 实现 RFC 7539的ChaCha20 and ChaCha20-Poly1305加密算法
3、java命令运行java文件
java Haha.java直接输出javac Haha.java &&java Haha
的结果。
4、废弃Nashorn JavaScript引擎
Nashorn被废弃,GraalVM为推荐引擎。
5、更灵活的String
去除空白
String text = " \u2000a b ";
Assert.assertEquals("a b",text.strip());
Assert.assertEquals("\u2000a b",text.trim());
Assert.assertEquals("a b ",text.stripLeading());
Assert.assertEquals(" \u2000a b",text.stripTrailing());
trim()和strip()的区别
jshell> var aaa = fullSpace + "aaa" + fullSpace
aaa ==> " aaa "
jshell> aaa.strip()
$14 ==> "aaa"
jshell> aaa.trim()
$15 ==> " aaa "
lines()
字符串实例方法,使用专门的 Spliterator 来懒惰地提供源字符串中的行
jshell> "test\nhoge\n".lines().map(String::toUpperCase).toArray()
$11 ==> Object[2] { "TEST", "HOGE" }
repeat(int)
按照参数 int 提供的次数来重复字符串的运行次数
jshell> "test".repeat(3)
$7 ==> "testtesttest"
isBlank()
验证当前字符串是否为空,或者是否只包括空白字符(空白字符由 Character.isWhiteSpace(int) 验证)
jshell> var halfSpace = "\u0020"
halfSpace ==> " "
jshell> halfSpace.isBlank()
$11 ==> true
jshell> var fullSpace = "\u3000"
fullSpace ==> " "
jshell> fullSpace.isBlank()
$13 ==> true
6、更方便的IO
Path
of(String, String...)
此前我们需要使用 Paths.get()。现在,我们像其他类一样使用 of()。
Files
writeString(Path, CharSequence)
我们可以使用该方法来保存一个 String 字符串。
jshell> Files.writeString(Path.of("test.txt"), "Hello!!!")
$3 ==> test.txt
readString(Path)
我们可以使用该方法来读取一个 String 字符串。
jshell> Files.readString(Path.of("test.txt"))
$4 ==> "Hello!!!"
Reader
nullReader()
使用该方法,我们可以得到一个不执行任何操作的 Reader。
Writer
nullWriter()
使用该方法,我们可以得到一个不执行任何操作的 Writer。
InputStream
nullInputStream()
使用该方法,我们可以得到一个不执行任何操作的 InputStream。
OutputStream
nullOutputStream()
使用该方法,我们可以得到一个不执行任何操作的 OutputStream。
JDK12新特性
1、switch语句
import java.io.IOException;
import static java.util.Calendar.*;
class Haha {
public static void main(String[] args) throws IOException, InterruptedException {
var day = 2;
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);
}
}
}
switch也可以用作语句
System.out.println(switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> -1;
});
2、数字转字符串NumberFormat
var cnf = NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.SHORT);
System.out.println(cnf.format(1_0000));
System.out.println(cnf.format(1_9200));
System.out.println(cnf.format(1_000_000));
System.out.println(cnf.format(1L << 30));
System.out.println(cnf.format(1L << 40));
System.out.println(cnf.format(1L << 50));
System.out.println(NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.SHORT).format(12345));
System.out.println(NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.LONG).format(12345));
3、String的成员函数非常多
transform
@Test
public void testStringTransform(){
System.out.println("hello".transform(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return s.hashCode();
}
}));
}
```
indent
```java
@Test
public void testStringIndent(){
System.out.println("hello".indent(3));
}
其它
JDK12放弃了对jdk6及其以前版本的支持。
参考资料
https://www.cnblogs.com/peter1018/p/9234490.html
https://segmentfault.com/a/1190000016527932
https://www.oschina.net/news/98314/java-11-api-changes-so-far
JDK10、JDK11、JDK12新特性的更多相关文章
- JDK8~JDK11的新特性
#JDK 1.8 新特性接口中的静态方法 只能由接口自己调用 接口中的默认方法 可以不被覆盖 #JDK 1.9 新特性(可能在JDK8中被忽略了,没来得及加)接口可以定义私有方法,但是只能让自己调用, ...
- JDK11&12 新特性学习
- jdk11新特性
JDK 11主要特性一览 jdk11即将在9月25号发布正式版.确定的新特性包括以下17个 181 嵌套类可见性控制 309 动态文件常量 315 改进 Aarch64 Intrinsics 318 ...
- 发布倒计时!JDK11为我们带来哪些新特性?
今年7月底,JDK11已经进入了Rampdown Phase Two阶段,这标志着该版本所有特性已经被冻结,不会有新的JEP会加入版本中. 这一阶段将会修复P1–P2级BUG,之后,JDK11预定于今 ...
- 【新特性】JDK11
随着JDK11正式发布,带来了许多新的特性.本文主要介绍JDK11的部分新特性和新的API. 一.Local Var 在Lambda表达式中,可以使用var关键字来标识变量,变量类型由编译器自行推断. ...
- JDK10 新特性
关于至此,我从大一下学习,以及大二上的巩固,这应该是SE部分的最后一章节内容,介绍一下jdk10的新特性 jdk在更新10之后,出现很多新特性,根据我所观看的视频,主要提及以下几点新特性 1.新增va ...
- JDK12的五大重要新特性
文章目录 JDK12的五大重要新特性 引入JVM常量API 扩展了switch语句 支持Unicode 11.0 为日本Reiwa Era提供了方形字符支持 NumberFormat增加了对以紧凑格式 ...
- Java5~11新特性
Java5~11版本新特性 Java5 Java6 Java7 Java8 Java9 Java10 Java11 Java5 Java5开发代号为Tiger(老虎),于2004-09-30发行 特性 ...
- JDK 5 ~ 10 新特性倾情整理!
JDK 5 ~ 10 新特性倾情整理! 最近连 JDK11都在准备发布的路上了,大家都整明白了吗?也许现在大部分人还在用6-8,8的新特性都没用熟,9刚出不久,10-11就不用说了. 为了大家对JDK ...
随机推荐
- AWS之EC2搭建WordPress博客
AWS之搭建WordPress博客 注意:请确定您已经成功完成LAMP架构的搭建; 1.下载并解压WordPress安装包: ①使用wget命令在WordPress官网获取最新安装包: [ec2-us ...
- 为何JAVAWEB绝对路径访问不了图片
为何JAVAWEB绝对路径访问不了图片?其实这涉及到两个原因 1:浏览器类型不同: 五大主流浏览器内核有所不同,能够支持的功能不一样:如谷歌浏览器就不能查看绝对路径 2:涉及到保护隐私安全: (谷歌浏 ...
- day31_8.12并发编程二线程
一.进程间的通信 在进程中,可以通过Queue队列进行通信,队列有两个特点: 1.先进先出.(先来的数据先被取出) 2.管道式存取.(数据取出一次后就不会在有了) 在python中有以下方法来操作数据 ...
- linux命令行常用光标移动快捷键(转)
转自:https://www.cnblogs.com/aslongas/p/5899586.html Linux 命令行快捷键 涉及在linux命令行下进行快速移动光标.命令编辑.编辑后执行历史命令. ...
- 洛谷 U87052 一线天
洛谷 U87052 一线天 题目传送门 题目背景 \(JDFZ\)即将举办第一届"一线天"趣味运动会...... 题目描述 "一线天"运动会在\(JLU\)南岭 ...
- 单交换机VLAN划分(基于Cisco模拟器)
实验目的: (1)掌握交换机配置的几种模式及基本配置命令. (2)掌握VLAN的原理及基于交换机端口的VLAN划分方法. 实验设备: 交换机一台,主机四台,直通线四根 实验步骤: 1.给交换机划分VL ...
- springboot模板(Freemarker与Thymeleaf)
Thymeleaf模板 Thymeleaf就是html页面 导入pom依赖 <dependency> <groupId>org.springframework.boot< ...
- Linux进程和计划任务管理
1.笔记: 去掉头部:ps -aux - - no -heade 默认信号:15 强制:9 在命令前些一个nohup不再占用终端 date -s:修改时间 ntpdate pool.ntp.org:同 ...
- csp考前
T1不会太麻烦,不行心里多说几遍"沙比提,沙比提".就做出来了. 后天就要出发了,可是我感觉不到长进---- 可能又学一年是个不明智的想法,退役预定.
- java大作业博客--购物车
Java 大作业----使用MySQL的购物车 一.团队介绍 姓名 任务 李天明.康友煌 GUI设计及代码编写 谢晓淞 业务代码编写.MySQL服务器平台部署.git代码库 严威 类和包的结构关系设计 ...