开们见山:OpenJDK
因为JDK8之后就开始收费了,而且更新速度更新一年两更 ,更细速度之快难以追逐,所以打算使用JDK8之后的版本建议使用OpenJDK;
首先 什么是OpenJDK:
这里先介绍一下JDK从8之后就开始收费了,OpenJDK是JDK的开放源码版本,也就是在09年的时候Sun公司由于各种原因被Oracle收购,即将被收购时Sun公司将JDK开源于是就出现了OpenJDK,open就是开发开源的意思,开放JDK源代码可供让全世界IT开发者学习。
JDK与OpenJDK主要区别是什么?
现在JDK归属于Oracle公司,每次Oracle公司发布新版的JDK时会发布两个版本:一个是加了一些自己Oracle公司的商业技术的JDK,另一个是OpenJDK。但是JDK与OpenJDK源代码差距也微乎其微,几乎也可以认为是一模一样。所以很多公司在JDK8之后想要免费更新新版本,可以采用OpenJDK。
其次 我们可以简单的看一下jdk8之后每个版本的新增的内容:
JDK8新特性
重要特性:Lambda表达式、函数式接口、方法引用、Stream流式API、采用MetaSpace代替了永久代(PermGen Space)
1、Lambda表达式
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。
2、并行(parallel)数组
Java 8增加了大量的新方法来对数组进行并行处理。可以说,最重要的是parallelSort()方法,因为它可以在多核机器上极大提高数组排序的速度。下面的例子展示了新方法(parallelXxx)的使用。
上面的代码片段使用了parallelSetAll()方法来对一个有20000个元素的数组进行随机赋值。然后,调用parallelSort方法。这个程序首先打印出前10个元素的值,之后对整个数组排序。这个程序在控制台上的输出如下(请注意数组元素是随机生产的)
3、接口可以添加默认方法和静态方法,也就是定义不需要实现类实现的方法
Java 8用默认方法与静态方法这两个新概念来扩展接口的声明。默认方法与抽象方法不同之处在于抽象方法必须要求实现,但是默认方法则没有这个要求,就是接口可以有实现方法,而且不需要实现类去实现其方法。我们只需在方法名前面加个default关键字即可实现默认方法。为什么要有这个特性?以前当需要修改接口的时候,需要修改全部实现该接口的类。而引进的默认方法的目的是为了解决接口的修改与现有的实现不兼容的问题。
默认方法语法格式如下:
public interface Vehicle {
default void print(){
System.out.println("我是一辆车!");
}
}
当出现这样的情况,一个类实现了多个接口,且这些接口有相同的默认方法,这种情况的解决方法:
1.是创建自己的默认方法,来覆盖重写接口的默认方法
2.可以使用 super 来调用指定接口的默认方法
Java 8 的另一个特性是接口可以声明(并且可以提供实现)静态方法。在JVM中,默认方法的实现是非常高效的,并且通过字节码指令为方法调用提供了支持。默认方法允许继续使用现有的Java接口,而同时能够保障正常的编译过程。尽管默认方法非常强大,但是在使用默认方法时我们需要小心注意一个地方:在声明一个默认方法前,请仔细思考是不是真的有必要使用默认方法,因为默认方法会带给程序歧义,并且在复杂的继承体系中容易产生编译错误。
4、方法引用
方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
定义了4个方法的Car这个类作为例子,区分Java中支持的4种不同的方法引用。
public static class Car {
public static Car create( final Supplier< Car > supplier ) {
return supplier.get();
}
public static void collide( final Car car ) {
System.out.println( "Collided " + car.toString() );
}
public void follow( final Car another ) {
System.out.