JDK的版本整理

来源:互联网 发布:java数组定义和初始化 编辑:程序博客网 时间:2024/06/04 14:54
摘要:JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境,JAVA工具和JAVA基础的类库。JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。

SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。
EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。
ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。
没有JDK的话,无法编译Java程序,如果想只运行Java程序,要确保已安装相应的JRE。

JDK不同版本

jdk1.5的新特性(代号:猛虎):
1.静态导入(import static)
import语句可以导入一个类或是某个包中的所有类。
import static 语句可以导入一个类中的某个静态方法或是所有静态方法。
例如:
Math类提供了很多于数学运算的静态方法,通常情况下我们是以Math.abs();这样的方式来进行调用函数的。但是我们可不可以只写出adb();
在JDK1.5之后,可以使用import static 语句导入一个类中的某个静态方法或是所有静态方法。这是JDK1.5的新特性之一。
例如:
import static java.lang.Math.abs;就可以直接写一个abs();函数。
import static java.lang.Math.*; 就可以直接调用Math类中的所有静态方法。

2.泛型(Generic)
在JDK1.5之前,在Java集合容器中(如:List)可以讲任何类型的对象加入到其中,此时被加入的对象被视为Object来看待。当从集合容器取出对象时,需要程序员自行保证对象类型的强制转换。如下:

这段代码中很显然List对象中的类型不匹配,但在JDK1.5之前会编译通过,运行时才会报错,这样在开发过程中很不好。所以JDK1.5引入了泛型(Generic)的概念。在看下面的代码:

泛型的引入在很大程度上避免了程序员自行保证集合容器中存取数据的强制转换。

3.For-Each循环(增强型for循环)
JDK1.5中,For-Each循环的加入简化了集合的遍历。假设我们要遍历一个集合对其中的元素进行一些处理。典型的代码为:

4.自动装包/拆包(Autoboxing/unboxing)
自动装包/拆包大大方便了基本类型数据和它们包装类地使用。
  自动装包:基本类型自动转为包装类.(int >> Integer)
  自动拆包:包装类自动转为基本类型.(Integer >> int)
5.枚举(Enums)
JDK1.5加入了一个全新类型的“类”-枚举类型。为此JDK1.5引入了一个新关键字enmu. 我们可以这样来定义一个枚举类型。如下:

之后,可以这样使用:
Gender gender = Gender.male;
也可以对枚举进行遍历,枚举类型提供了两个静态方法values()和valueOf():

6.可变参数(Varargs)
可变参数使程序员可以声明一个接受可变数目参数的方法(类似于多个方法重载,只不过是可变参数提供一个方法实现多个方法的重载,变得只是方法其中的参数)。
注意:可变参数必须是函数声明中的最后一个参数。
比如:我们编写一个简单的打印方法,以传统的方式实现方法重载:

下面使用可变参数来实现这些方法的重载:

调用方法:
Write(“abc”,123,new ArrayList()); // 当然其中的参数可以是任意类型,任意多个
// 这就很方便的实现了方法重载
输出:
java.lang.String
java.lang.Integer
java.util.ArrayList
JDK1.6新特性:(代号“野马”)
1.DestTop类和SystemTray类
前者用于调度操作系统中的一些功能,例如:
· 可以打开系统默认浏览器指定的URL地址;
· 打开系统默认邮件客户端给指定的邮箱发信息;
· 用默认程序打开或编辑文件;
· 用系统默认的打印机打印文档。
后者可用来在系统托盘区创建一个托盘程序。

2.使用JAXB2来实现对象与XML之间的映射
JAXB是Java Architecture for XML Binding的简写。JAXB是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
原来JAXB是Java EE的一部分,在JDK6中,SUN将其放到了Java SE中。

3.StAX
StAX是JDK1.6中除了DOM和SAX之外的有一种处理XML文档的API。
StAX是The Streaming API for XML的缩写。由于JDK6.0中的JAXB2和JAX-WS 2.0都会用到StAX,所以Sun决定把StAX加入到JAXP家族当中来,并将JAXP的版本升级到1.4.
JDK6里面JAXP的版本就是1.4。JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口。

4.使用Complier API
现在我们可以用JDK1.6 的Compiler API动态编译Java源文件,Compiler API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码,有点动态语言的特征。
这个特性对于某些需要用到动态编译的应用程序相当有用, 比如JSP Web Server,当我们手动修改JSP后,是不希望需要重启Web Server才可以看到效果的,这时候我们就可以用Compiler API来实现动态编译JSP文件。

5.轻量级的Http Server API
JDK6 提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http Server,它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server API来实现。

6.插入式注解处理API(Pluggable Annotation Processing API)
JSR (JSR是Java Specification Requests的缩写,意思是Java 规范请求)用Annotation Processor在编译期间而不是运行期间处理Annotation, Annotation Processor相当于编译器的一个插件,所以称为插入式注解处理。

7.用Console开发控制台程序
JDK6中提供了java.io.Console 类专用来访问基于字符的控制台设备. 你的程序如果要与Windows下的cmd或者Linux下的Terminal交互,就可以用Console类代劳。

8.对脚本语言的支持
如: ruby, groovy, javascript

9.Common Annotations
Common annotations原本是Java EE 5.0规范的一部分,现在SUN把它的一部分放到了Java SE 6.0中.随着Annotation元数据功能加入到Java SE 5.0里面,很多Java 技术(比如EJB,Web Services)都会用Annotation部分代替XML文件来配置运行参数,保证Java SE和Java EE 各种技术的一致性.。
JDK1.7新特性:
1.对Java集合(Collections)的增强支持
在JDK1.7之前的版本中,Java集合容器中存取元素的形式如下:
以List、Set、Map集合容器为例:

在JDK1.7中,摒弃了Java集合接口的实现类,如:ArrayList、HashSet和HashMap。而是直接采用[]、{}的形式存入对象,采用[]的形式按照索引、键值来获取集合中的对象,如下:

2.在Switch中可用String
在之前的版本中是不支持在Switch语句块中用String类型的数据的,这个功能在C#语言中早已被支持,好在JDK1.7中加入了。

3.数值可加下划线
例如:int one_million = 1_000_000;

4.支持二进制文字
例如:int binary = 0b1001_1001;

5.简化了可变参数方法的调用
当程序员试图使用一个不可具体化的可变参数并调用一个varargs (可变)方法时,编辑器会生成一个“非安全操作”的警告。

6.自动资源管理

JDK1.8的新特性
一、接口的默认方法
Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法。
二、Lambda 表达式
在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:
Collections.sort(names, (String a, String b) -> {

return b.compareTo(a);

});
三、函数式接口
Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
四、方法与构造函数引用
Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用,上面的代码展示了如何引用一个静态方法,我们也可以引用一个对象的方法:
converter = something::startsWith;

String converted = converter.convert(“Java”);

System.out.println(converted);
五、Lambda 作用域
在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。
六、访问局部变量
可以直接在lambda表达式中访问外层的局部变量:
七、访问对象字段与静态变量
和本地变量不同的是,lambda内部对于实例的字段以及静态变量是即可读又可写。该行为和匿名对象是一致的:
八、访问接口的默认方法
JDK 1.8 API包含了很多内建的函数式接口,在老Java中常用到的比如Comparator或者Runnable接口,这些接口都增加了@FunctionalInterface注解以便能用在lambda上。
Java 8 API同样还提供了很多全新的函数式接口来让工作更加方便,有一些接口是来自Google Guava库里的,即便你对这些很熟悉了,还是有必要看看这些是如何扩展到lambda上使用的。

0 0