版本区分
预览版:该功能在当前版本可以使用,如果效果不是很好的话,可能以后的其他版本就会删去该功能。
最终版:该功能在之前版本效果很好,之后的每个版本中都会存在该功能。
JDK8
Lambda
/**
* 匿名开启一个线程
*/
public static void jdk8Lambda() {
new Thread(() -> System.out.println("-------------")).start();
}
Stream
Java 8 API 添加了一个新的抽象称为流 Stream,可以让你以一种声明的方式处理数据。
/**
* 去重
*/
public static void jdk8Stream() {
List<String> list2 = new ArrayList<>();
list2.add("aaa bbb ccc");
list2.add("ddd eee fff");
list2.add("ggg hhh iii");
list2.add("ggg hhh iii");
list2.stream().distinct().forEach(System.out::println);
}
Optional
Optional 类是一个可以为 null 的容器对象。如果值存在则 isPresent() 方法会返回 true,调用 get() 方法会返回该对象。
/**
* optional
*/
public static void jdk8Optional() {
// 1、创建一个包装对象值为空的Optional对象
Optional<String> optStr = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional<String> optStr1 = Optional.of("xiaofei");
// 3、创建包装对象值允许为空的Optional对象
Optional<String> optStr2 = Optional.ofNullable(null);
}
时间 API
/**
* 时间API
*/
public static void jdk8DateTime() {
// 获取当前年月日
LocalDate localDate = LocalDate.now();
System.out.println(localDate);
// 获取当前时间
LocalTime localTime = LocalTime.now();
System.out.println(localTime);
// 获取具体时间
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
// 字符串转换
String str = "2022-01-01";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate localDate2 = LocalDate.parse(str, formatter);
System.out.println(localDate2);
}
方法引用
/**
* 方法引用
*/
public static void jdk8Method() {
List<String> names = new ArrayList();
names.add("Xf");
names.add("xiaofei");
// 实例中我们将 System.out::println 方法作为静态方法来引用。
names.forEach(System.out::println);
}
内置 Base64
/**
* Base64
*/
public static void jdk8Base64() {
// 使用基本编码
String base64encodedString = null;
try {
base64encodedString = Base64.getEncoder().encodeToString("xiaofei".getBytes("utf-8"));
System.out.println("Base64编码字符串:" + base64encodedString);
// 解码
byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
System.out.println("Base64解码字符串:" + new String(base64decodedBytes));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
JDK9
接口可以添加私有方法
/**
* 接口可以添加私有方法
*/
interface Jdk9Interface{
default String defaultTest() {
privateTest();
return "default";
}
private String privateTest() {
System.out.println("私有方法");
return "private";
}
}
异常处理 try 升级
Jdk8每一个流打开的时候都要关闭, 但是在 try 的括号中来进行关闭。
Jdk9 直接在括号里面写变量就可以关闭了。
/**
* 异常处理try升级
*/
public static void jdk9Try(){
// jdk8:
try(InputStreamReader reader =new InputStreamReader(System.in)){
reader.read();
}catch (IOException e){
e.printStackTrace();
}
// jdk9以后:
InputStreamReader reader =new InputStreamReader(System.in);
try(reader){
reader.read();
}catch (IOException e){
e.printStackTrace();
}
}
增强钻石操作符 <>
/**
* 增强钻石操作符 "<>"
*/
public static void jdk9Diamonds(){
// java7和8 <>没有了数据类型
Map<String,String> map8 = new HashMap<>(1);
// java9 添加了匿名内部类的功能 后面添加了大括号{} 可以做一些细节的操作
Map<String,String> map9 = new HashMap<>(1){
@Override
public int size() {
return 0;
}
};
}
增强了 JDK8 特性
增强了 JDK8 的特性如:Stream,Optional,Process API
引进 HttpClient
以往我们都是通过 maven 添加 httpclient ,java9 直接引入即可。
JDK10
局部变量 var
将前端思想 var 关键字引入 java 后段,自动检测所属于类型,一种情况除外,不能为 null,因为不能判断具体类型,会报异常。
/**
* 局部变量var
*/
public static void jdk10Var() {
var number = 10;
var str = "小飞博客";
var list = new ArrayList<>(1);
var map = new HashMap<>(1);
var set = new HashSet<>(1);
}
copyOf 方法
在 java.util.List、java.util.Set、java.util.Map 新增加了一个静态方法 copyOf,这些方法按照其迭代顺序返回一个不可修改的列表、集合或映射包含了给定的元素的集合。但是如果将返回后的集合继续修改,那么报异常。
/**
* copyOf方法
*/
public static void jdk10CopyOf() {
var list = new ArrayList<>();
list.add("first");
list.add("second");
list.add("third");
var result = List.copyOf(list);
System.out.println(result.toString());
}
垃圾收集器的优化
1、JDK9:新生代:ParNew 收集器。 老年代:Parallel Old 收集器
2、JDK10:G1(Garbage-First)全收集器
3、JDK10 中含有垃圾收集器的可视化工具。在 JDK 安装目录的 bin 中 jmc.exe
JDK11
Lambda 中使用 var
Consumer<String> consumer = (var t) ->System.out.println(t.toUpperCase());
字符串 API 增强
自 JDK9 和 JDK10 都为 java 增加了许多的 API,如今 JDK11 又增加了许多字符串自带方法,如下
/**
* 局部变量var
*/
public static void jdk11String() {
String str = "xiaofei ";
// 判断字符串是空白
boolean isblank = str.isBlank();
// 判断字符串是否为空
boolean isempty = str.isEmpty();
// 首位空白
String result1 = str.strip();
// 去除尾部空白
String result2 = str.stripTrailing();
// 去除首部空白
String result3 = str.stripLeading();
// 复制几遍字符串
String copyStr = str.repeat(2);
// 行数统计
long lineCount = str.lines().count();
System.out.println(isblank);
System.out.println(isempty);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
System.out.println(copyStr);
System.out.println(lineCount);
}
结果:
false
false
xiaofei
xiaofei
xiaofei // 这里有空格
xiaofei xiaofei
Process finished with exit code 0
javac + java 命令合并
以前编译一个 java 文件时,需要先 javac 编译为 class,然后再用 java 执行,现在可以放到一起执行了。
$ java HelloWorld.java
Hello Java 11!
JDK12
Switch 表达式(预览版)
Switch 优化
/**
* Switch优化
*/
public static void jdk12Switch() {
var day = 1;
switch (day) {
case 1, 2, 3 -> System.out.println(1);
case 6 -> System.out.println(2);
case 10, 11 -> System.out.println(3);
case 20 -> System.out.println(4);
}
}
instanceof + 类型强转
/**
* instanceof
*/
public static void jdk12Instanceofh() {
Object obj = "XiaoFei";
// jdk12之前
if (obj instanceof String) {
String s = (String) obj;
int length = s.length();
System.out.println(length);
}
// jdk12之后
if (obj instanceof String str) {
int length = str.length();
System.out.println(length);
}
}
JDK13
switch 优化更新(预览版)
Switch 优化
JAVA 12 中虽然增强了 swtich 语法,但并不能在 -> 之后写复杂的逻辑,JAVA 13 带来了 swtich 可以直接返回信息到变量上面。
/**
* Switch优化
*/
public static void jdk13Switch() {
int k = 2;
String result = switch (k) {
case 1 -> "one";
case 2 -> "two";
default -> "many";
};
System.out.println(result);
}
Switch 优化
Java 13 开始,文本块可用作预览功能。它们以三个双引号(”””)开头。
/**
* 文本块升级
*/
public static void jdk13Text() {
// jdk13之前
String html1 = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
// jdk13之后
String html2 = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
}
JDK14
1、Switch(最终版)
2、垃圾回收器(更新优化)
3、Record(预览功能)
4、instanceof 的模式匹配(预览版)
5、jpackage 打包 (预览版)
新增 Record
使用它可以替代构造器、equal 方法、toString 方法,hashCode 方法。
public record Person(String name, int age) {}
新增 Record
新增 jpackage 打包工具,直接打包二进制程序,再也不用装 JRE 了!
JDK15
1、jpackage 打包 (预览版)
2、文本块(最终版)
3、Record(第二预览版)
4、Sealed 类(第一预览版)
支持 Unicode 13.0
此版本将 Unicode 支持升级到 13.0,增加了 13.0 5930 个字符,总共 143859 个字符类支持 Unicode 字符数据库,以及 55 个新表情符号字符。
封闭 Sealed 类
sealed 可以定义哪些其他类或接口可以扩展或实现当前类。
JDK16
1、Record(最终版)
2、密封类(第二预览版)
3、jpackage 打包 (最终版)
Stream 新增 toList 方法
.collect(Collectors.toList());
.toList();
JDK17
Realed class 密封类(最终版)
随机数增强
新加了一个类: RandomSupport, 又一个 3000 行的 Java 文件。
var random = RandomGenerator.of("L32X64MixRandom");
for (int i = 0; i < 10; i++) {
System.out.println(random.nextInt());
}