JDK9
-
模块系统(Module System):这是Java 9最大的特性,它提供了类似于OSGI框架的功能,模块之间存在相互的依赖关系,可以导出一个公共的API,并且隐藏实现的细节。Java提供该功能的主要的动机在于,减少内存的开销
-
模块系统(Module System):这是Java 9最大的特性,它提供了类似于OSGI框架的功能,模块之间存在相互的依赖关系,可以导出一个公共的API,并且隐藏实现的细节。Java提供该功能的主要的动机在于,减少内存的开销。
-
JShell和Jlink:JShell是Java 9中新增的交互式Java编程环境,类似于Python的交互式环境。它允许开发者在命令行界面中快速编写和测试Java代码。Jlink是Java 9中新增的工具,用于生成自定义的Java运行时映像,可以包含或排除特定的模块。
-
不可变集合类工厂方法:Java 9新增了一些不可变集合类工厂方法,这些方法可以更方便地创建不可变集合。
-
接口中的私有方法:在Java 9中,接口可以包含私有方法,这使得接口的实现更加灵活。
-
try-with-resources改进:Java 9对try-with-resources进行了改进,使其能够更好地处理异常和资源关闭。
-
平台日志API和服务:Java 9提供了新的平台日志API和服务,这使得开发者可以更加方便地记录日志。
-
垃圾回收器:Java 9新增了Shenandoah垃圾回收器,这是一种新的垃圾回收器,旨在提供更高效的垃圾回收。
模块化系统
-
本质上讲也就是说,用模块来管理各个package,通过声明某个package暴露,模块(module)的概念,其实就是package外再裹一层,不声明默认就是隐藏。因此,模块化使得代码组织上更安全,因为它可以指定哪些部分可以暴露,哪些部分隐藏。
-
实现目标 模块化的主要目的在于减少内存的开销 只须必要模块,而非全部jdk模块,可简化各种类库和大型应用的开发和维护 改进 Java SE 平台,使其可以适应不同大小的计算设备 改进其安全性,可维护性,提高性能
JShell命令
像Python 和 Scala 之类的语言早就有交互式编程环境 REPL (read - evaluate - print - loop)了,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码,就可以在编译前获得对程序的反馈。而之前的Java版本要想执行代码,必须创建文件、声明类、提供测试方法方可实现。
接口私有方法
public interface JDK9Demo4 {
//接口默认都是共有静态常量
public static final int NUM = 10;
//接口默认方法都是抽象方法
public abstract void method1();
//jdk8接口可以有静态方法
public static void method2(){
System.out.println("接口中的静态方法");
}
//jdk8接口可以有默认方法
public default void method3(){
System.out.println("接口中的默认方法");
}
//jdk9接口可以有私有方法
private void method4(){
System.out.println("接口中的私有方法");
}
}
钻石操作符使用升级
<>必须写类型。
try 语句
Java 8 中,可以实现资源的自动关闭,但是要求执行后必须关闭的所有资源必须在try子句中初始化,否则编译不通过。 Java 9 中,用资源语句编写try将更容易,我们可以在try子句中使用已经初始化过的资源,此时的资源是final的
String 存储结构变更
结论:String 再也不用 char[] 来存储啦,改成了 byte[] 加上编码标记,节约了一些空间。
集合特性of()
//jdk8以前创建只读集合
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
Collection<String> list2 = Collections.unmodifiableCollection(list);
// list2.add("赵六");
// System.out.println(list2);
//jdk9创建只读集合
List<String> list3 = List.of("张三", "李四", "王五");
System.out.println(list3);
Set<String> set1 = Set.of("AA", "BB", "CC");
System.out.println(set1);
Map<String, String> map = Map.of("k1", "v1", "k2", "v2");
System.out.println(map);
InputStream增强
InputStream 终于有了一个非常有用的方法:transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法
增强的 的 Stream API
-
在 Java 9 中,Stream API 变得更好,Stream 接口中添加了 4 个新的方法:takeWhile, dropWhile, ofNullable,还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。
takeWhile() 的使用
用于从 Stream 中获取一部分数据,接收一个 Predicate 来进行选择。在有序的Stream 中,takeWhile 返回从开头开始的尽量多的元素。
public static void main(String[] args) throws Exception {
List<Integer> list = Arrays.asList(10,20,30,40,30,20,10);
list.stream().takeWhile(t->t<40).forEach(System.out::println);
List<Integer> list2 = Arrays.asList(1,2,3,4,5,6,7);
list2.stream().takeWhile(t->t<7).forEach(System.out::println);
}
dropWhile() 的 使用
dropWhile 的行为与 takeWhile 相反,返回剩余的元素。
ofNullable() 的 使用
Java 8 中 Stream 不能完全为null,否则会报空指针异常。而 Java 9 中的 ofNullable 方法允许我们创建一个单元素 Stream,可以包含一个非空元素,也可以创建一个空Stream。
public static void main(String[] args) throws Exception {
//允许通过
Stream<String> streams = Stream.of("AA","BB",null);
System.out.println(streams.count());
//不允许通过
/*Stream<Object> stream2 = Stream.of(null);
System.out.println(stream2.count());*/
//允许通过
Stream<Object> stream2 = Stream.ofNullable(null);
System.out.println(stream2.count());
}
iterate() 重载的使用
public static void main(String[] args) throws Exception {
//原始方式
Stream.iterate(1,i->i+1).limit(50).forEach(System.out::println);
//增强方式
Stream.iterate(1,i->i<60,i->i+1).forEach(System.out::println);
}
JDK10 新特性
public static void method2(){
//由于值是null,类型无法推断
// var i = null;
//方法引用无法使用var
//var a = System.out::println;
//lamdba无法推断var的类型,故不能用
/* Function<Integer,String> fun = (Integer a)->{
return a+"";
};*/
/* var fun2 = (Integer a)->{
return a+"";
};*/
//静态数组后面不加类型的时候推断不出来var的类型,故不能用
int[] arr = new int[]{1,2,3};
int[] arr2 = {1,2,3};
//var arr3 = {1,3,4};
}
新增不可变集合方法(只读)
自 Java 9 开始,Jdk 里面为集合(List / Set / Map)都添加了 of (jdk9新增)和copyOf (jdk10新增)方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别。
public static void main(String[] args) throws Exception {
//示例1
var list1 = List.of("AA","BB","CC");
var list2 = List.copyOf(list1);
System.out.println(list1==list2);//true
//示例2
var list3 = new ArrayList<String>();
list3.add("AA");
list3.add("BB");
List<String> list4 = List.copyOf(list3);
System.out.println(list3==list4); //false
}
JDK 11新特性
增加ZGC垃圾回收器
GC是java主要优势之一。 然而, 当GC停顿太长, 就会开始影响应用的响应时间。消除或者减少GC停顿时长, java将对更广泛的应用场景是一个更有吸引力的平台
优势:
-
GC暂停时间不会超过10ms
-
既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)
-
和G1相比, 应用吞吐能力不会下降超过15%
-
为未来的GC功能和利用colord指针以及Load barriers优化奠定基础
-
初始只支持64位系统
Optional加强
Optional 也增加了几个非常酷的方法,现在可以很方便的将一个 Optional 转换成一个 Stream, 或者当一个空 Optional 时给它一个替代的。