以下样例代码均可在样例代码中查看
jdk9新特性
新功能和库的更新
"_"为关键字,不可作为变量名
As of Java 9, '_' is a keyword, and may not be used as an identifier
String _ = "123"; //编译错误
### 接口新增私有方法
新增私有方法,方便在接口多个实现中使用
public interface PrivateInterfaceMethod {
/**
* jdk1.9新增
/
private static void testPri() {
System.out.println(“接口私有方法”);
}
/*
* jdk1.8新增静态方法和默认方法
*/
public static void test1() {
System.out.println(“静态方法”);
testPri();
}
default void test2() { // 可以被实现类覆写
System.out.println(“默认方法”);
testPri();
}
}
### 钻石操作符(泛型)的升级
/**
* 创建范型类的时候,可以重写其中的方法
*/
Set<String> set = new HashSet<String>() {
@Override
public boolean add(String s) {
return super.add(s + "&");
}
};
set.add("1");
set.add("2");
set.add("3");
set.forEach(System.out::println);
### 支持在try外进行实例化
支持在try外进行实例化,try内对象为final不可再修改; 结束后自动释放
InputStreamReader reader = new InputStreamReader(System.in);
InputStreamReader reader1 = new InputStreamReader(System.in);
/**
* 支持在try外进行实例化,try内对象为final不可再修改; 结束后自动释放
*/
try (reader;reader1) { //支持多个,用;分隔即可
// do something
reader.read();
reader1.read();
} catch (IOException e) {
System.err.println("异常:" + e);
}
### String存储结构发生变化
char[]修改为byte[],String,StringBuffer,StringBuilder
jdk1.8及以前
![jdk8String存储](https://img-blog.csdnimg.cn/ff436b68941549729760a1a81fe37505.png#pic_center)
9以后
![jdk9+存储结构](https://img-blog.csdnimg.cn/62ddc0d524184f99aef90d14c54c9964.png#pic_center)
### 集合调整-快速创建只读集合
List<Integer> integers = Collections.unmodifiableList(Arrays.asList(1, 2, 3));
// java.lang.UnsupportedOperationException
// integers.add(4);
//9以后可使用这种方式
List<Integer> integers1 = List.of(1, 2, 3);
// java.lang.UnsupportedOperationException
//integers1.add(4);
Map<Object, Object> map = Collections.unmodifiableMap(new HashMap<>() {
{
put("a", "a");
put("b", "b");
put("c", "c");
}
});
//9以后可使用这种方式
Map<String, Object> map1 = Map.ofEntries(Map.entry("a", 1), Map.entry("b", 2), Map.entry("c", 3)); // 传入一个个键值对entry对象
Map<String, Object> map2 = Map.of("a", 1, "b", 2, "c", 3); // 入参顺序:k1, v1, k2, v2...
### 增强流API
- takeWhile()
- dropWhile()
- of()
- ofNullable()
- iterator增加结束条件
List<Integer> a = new ArrayList<>();
a.add(1);
a.add(3);
a.add(5);
a.add(7);
a.add(9);
// 直到不满足条件,停止读取
a.stream().takeWhile(b -> b < 5).forEach(System.out::println);
System.out.println("----------");
//直到满足条件,才开始读取
a.stream().dropWhile(b -> b < 5).forEach(System.out::println);
System.out.println("----------");
Stream.ofNullable(null).forEach(System.out::println);
System.out.println("----------");
Stream.of("123", "234", null, null, "345").forEach(System.out::println);
//------------------
Stream.iterate(0, x -> x < 3, x -> x + 1).forEach(System.out::println);
System.out.println(“--------------”);
//等价于
for (int x=0;x<3;x++) {
System.out.println(x);
}
### I/O流新特性
- readAllBytes:读取 InputStream 中的所有剩余字节。
- readNBytes: 从 InputStream 中读取指定数量的字节到数组中。
- transferTo:读取 InputStream 中的全部字节并写入到指定的 OutputStream 中。
### HttpClient重写
HttpClient增加异步调用 sendAsync()
## JVM优化
## 其他功能
JShell
使用jshell命令启动jshell,输入表达式即可实现基本功能运算
jshell> int add(int x, int y) {
...> return x + y;
...> }
jshell> add(1, 2)
$2 ==> 3
改进应用安全性能
新增4个SHA-3哈希算法,SHA3-224,SHA3-256,SHA3-384和SHA3-512。另外也增加了通过 java.security.SecureRandom 生成使用 DRBG 算法的强随机数
多分辨率图像API
统一的jvm日志系统
JDK10新特性
新功能和库的更新
局部变量类型推断
现在有var声明。它允许开发者在不指定其类型的情况下声明局部变量。变量的类型将从创建的实际对象的类型中推断出来。
public static void main(String[] args) {
var a = "123";
var b = 123;
var c = new VarTest();
// Integer aInt = (Integer)a;
var bInt = (Integer)b;
System.out.println(a.getClass()); //String
System.out.println(bInt.getClass());
System.out.println(c.getClass());
/**
* class java.lang.String
* class java.lang.Integer
* class com.mochi.jdk10.VarTest
*/
}
Optional增强
Optional.orElseThrow(),orElseThrow类中添加了一个新方法。
它是现有方法的同义词,现在是现有方法的首选替代get方法。
System.out.println(Optional.ofNullable(null).orElse("123"));
//也可以使用函数式接口实现
System.out.println(Optional.ofNullable(null).orElseGet(() -> "123"));
//或者抛出异常
S