目录
一、JDK环境部署
1.1 JDK18与IDEA2022环境准备
二、JDK9-10新特性
2.1 JDK9新特性——私有接口方法
2.2 JDK9新特性——通过try块自动关闭资源
2.4 JDK10新特性——var动态类型推断
局部变量类型推断:
不可变集合:List.copyOf(提高数据安全性)
Java11 新的String方法:
三、JDK12-14新特性
3.2 JDK12新特性——增强的switch分支判断
3.3 JDK13新特性——文本块特性
四、总结
4.1 总结
80%企业应用都在使用JDK8来做开发。
1. JDK9: 私有接口方法
2. JDK9: Try自动关闭IO流
3. JDK10: var动态类型推断
4. JDK10: 不可变集合
5. JDK11: 新的String方法
6. JDK12: 新版swith语法
7. JDK13: 文本块特性
JDK18与IDEA2022环境准备:
Java Downloads | Oracle
下载 IntelliJ IDEA:JetBrains 功能强大、符合人体工程学的 Java IDE
2017年9月21日,JDK9正式发布。JDK9提供了超过150项新功能特性,包括备受期待的模块化系统、可交互REPL工具、jshell、JDK编译工具、公共API和接口私有代码、以及安全增强、扩展提升、性能管理改善等。可以说JDK9是一个庞大的系统工程,完全做了一个整体改变。
私有接口方法:
在JDK8之前,接口可以有常量变量和抽象方法,不能在接口中提供方法实现。
JDK9不仅像JDK8一样支持接口默认方法,同时还支持私有方法新特性。
通过接口私有方法,可以进一步增强接口的灵活性。
package com.imooc.jdk9;
//私有接口方法
public interface Sample01 {
//在真正项目开发中,IP地址等信息要动态获得。
//IP变化,要执行某个命令获取新的IP地址。
//动态行为,变量无法实现,最好封装成方法。
//String ip = "192.168.1.30";
default void showInfo(){
System.out.println("基本信息");
System.out.println("IP地址:" + getIp());
}
default void showDetail(){
System.out.println("详细信息");
System.out.println("IP地址:"+ getIp());
}
//私有接口方法为 默认接口方法服务。
private String getIp(){
return "192.168.1.30";
}
}
Try自动关闭IO流。
没有此新特性之前,释放资源的代码 比主体代码还多,明显不适宜。
package com.imooc.jdk9;
import java.io.*;
//通过try块自动关闭资源
public class Sample02 {
public static void main(String[] args) throws FileNotFoundException {
File source = new File("d:/demo.jpg");
File target = new File("d:/demo1.jpg");
//通过try块自动关闭资源
try (InputStream fis = new FileInputStream(source);
OutputStream fos = new FileOutputStream(target);){
byte[] bs = new byte[1024];
int len;
//利用read方法循环读取的字节数据,并进行处理
while((len = fis.read(bs)) != -1){
System.out.println(len);
//将读取到到字节数组写入到输出流
fos.write(bs,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2018年3月21日,JDK10正式发布。JDK9与JDK10都不是长期支持版本(LTS),JDK11是长期支持版本。
JDK10新增了109个新特性,与开发相关的关键特性有两个:局部变量类型推断、不可变集合。
package com.imooc.jdk10;
import java.util.ArrayList;
//var动态类型推断
public class Sample03 {
public static void main(String[] args) {
var str = new String("a");
var str1 = "a";
System.out.println(str instanceof String);
System.out.println(str1 instanceof String);
var list = new ArrayList();
list.add("abc");
//list.add(321);
//var l = 100l; //var在直接赋值数据类型时返回对应数据类型
var l = Long.valueOf(100l); //要返回包装类型对象要用valueOf方法
System.out.println(l instanceof Long);
var b = Boolean.valueOf(true);
System.out.println(b instanceof Boolean);
}
}
package com.imooc.jdk10;
import java.util.ArrayList;
import java.util.List;
//不可变集合
public class Sample04 {
public static void main(String[] args) {
final var list = new ArrayList();
list.add("ABC");
list.add("BCD");
list.add("EFG");
//List.copyOf创建不可变集合
List copyList = List.copyOf(list);
copyList.add("A"); //会抛出不可操作异常
}
}
package com.imooc.jdk11;
//新的String方法
public class Sample05 {
public static void main(String[] args) {
String str = " www.imooc.com ";
boolean isblank = str.isBlank(); //判断字符串是空白,可以都是空格,长度不为0
System.out.println(str + "是否空白:" + isblank);
boolean isempty = str.isEmpty(); //判断字符串是否为空,长度=0
System.out.println(str + "是否为空:" + isempty);
String result1 = str.strip(); //去掉首尾空白(包括全角空格),trim()只能去掉半角空格
System.out.println(str + "去除首尾空白:" + result1.length());
String result2 = str.stripTrailing(); //去除尾部空白
System.out.println(str + "去除尾部空白:" + result2.length());
String result3 = str.stripLeading(); //去除首部空白
System.out.println(str + "去除首部空白:" + result3.length());
String copyStr = str.repeat(2); //复制几遍字符串
System.out.println(str + "复制两次:" + copyStr);
long lineCount = copyStr.lines().count(); //行数统计
System.out.println(str + "行数:" + lineCount);//
}
}
JDK12 is the open-source reference implementation of version 12 of the Java SE Platform as specified by JSR 386 in the Java Community Process.
JDK12 reached General Availability on 19 March 2019. Production-ready binaries under the GPL are available from Oracle; binaries from other vendors will follow shortly.
The features and schedule of this release were proposed and tracked via the JEP Process, as amended by the JEP 2.0 proposal. The release was produced using the JDK Release Process(JEP 3).
2019年3月19日JDK12诞生了,短期支持版本,日常项目中不建议使用它。但是它推出了一个非常重要的,影响到Java整个体系的语法规则,增强的Switch分支语法。
package com.imooc.jdk12;
import java.util.Random;
//新版swith语法
public class Sample06 {
public void oldSwitch(){
int day = new Random().nextInt(7);
int result = 0;
switch (day) {
case 0:
case 1:
case 2:
result = 88;
break;
case 3:
result = 99;
break;
case 4:
case 5:
result = 101;
break;
case 6:
result = 120;
break;
default:
result = -1;
}
System.out.println(result);
}
public void newSwitch(){
int day = new Random().nextInt(7);
int result = switch (day){
case 0,1,2 -> 88;
case 3 -> 99;
case 4,5 -> 101;
case 6 -> 120;
default -> -1;
};
System.out.println(result);
}
public static void main(String[] args) {
new Sample06().newSwitch();
}
}
JDK13 2019年9月17日发布的,短暂的版本,有了一个千呼万唤很多的年的特性,文本块特性。对我们日常开发有非常大的帮助。
从JDK14开始,语法层面已经非常成熟。JDK14~18只是对现有语法进行完善,底层更多关注具体功能层面上、运行机制上的升级和更新。
14
更有价值的NullPointer
record记录类型
15
密封类