jdk各个版本【简】

jdk介绍

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+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的基本组件:

javac – 编译器,将源程序转成字节码
jar – 打包工具,将相关的类文件打包成一个文件
javadoc – 文档生成器,从源码注释中提取文档
jdb – debugger,查错工具
java – 运行编译后的java程序(.class后缀的)
appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。
Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。
Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
Jconsole: Java进行系统调试和监控的工具

jdk源码常用类解

java.lang:这个是系统的基础类,比如String等都是这里面的,这个包是唯一一个可以不用引入(import)就可以使用的包。
java.io: 这里面是所有输入输出有关的类,比如文件操作等。
java.nio:为了完善io包中的功能,提高io包中性能而写的一个新包 ,例如NIO非堵塞应用
java.net: 这里面是与网络有关的类,比如URL,URLConnection等。
java.util: 这个是系统辅助类,特别是集合类Collection,List,Map等。
java.sql: 这个是数据库操作的类,Connection, Statement,ResultSet等。
javax.servlet:这个是JSP,Servlet等使用到的类。

bin目录下的基本工具

1.Javac: Java源程序编译器,将Java源代码转换成字节码。
2.Java: Java解释器,直接从字节码文件(又称为类文件).执行Java应用程序的字节代码。
3.appletviewer.exe Java applet浏览器。appletviewer命令可在脱离万维网浏览器环境的情况下运行applet
4.jar: java应用程序打包工具,可将多个类文件合并为单个JAR归档文件。
5.Javadoc: Java API文档生成器从Java源程序代码注释中提取文档,生成API文档HTML页。
6.jdb: Java调试器(debugger),可以逐行执行程序.设置断点和检查变Md
7.jps: 查看Java虚拟机进程列表

jdk各个版本

jdk1.5的新特性

1. 泛型
   ArrayList list=new ArrayList()------>ArrayList<Integer>list=new ArrayList<Integer>();
2. 自动装箱/拆箱
   nt i=list.get(0).parseInt();-------->int i=list.get(0);原始类型与对应的包装类不用显式转换
3. for-each(优化循环语句for(int n:numbers))
   i=0;i<a.length;i++------------>for(int i:a){......}
4. static import(静态导入)
   Math.sqrt();--------------->sqrt();
5. 可变参数
   int sum(int ...intlist)有任意个参数,把他看作数组
6. 枚举Enumeration
7. Annotations

jdk1.6的新特性

1.UI的增强
2.脚本语言支持
3.JDBC4.0
4.更简单,更强大的JAX-WS:对WebService支持的增强(JAX-WS2.0和JAXB2.0)
5.轻量级Http Server
6.嵌入式数据库 Derby
7.通用的Annotations支持
8.新增加编译器 API 

jdk1.7的新特性

1.switch中可以使用字符串

String s = "a";   
switch (s) {   
case "a" :   
  System.out.println("a");   
case "b" :   
  System.out.println("b");   
  break ;   
default :   
  System.out.println("c");   
  break ;   
}  

2.运用List<String> tempList = new ArrayList<>(); 即泛型实例化类型自动推断
3.语法上支持集合,而不一定是数组
4.新增一些取环境信息的工具方法

File System.getJavaIoTempDir() // IO临时文件夹  
File System.getJavaHomeDir() // JRE的安装目录  
File System.getUserHomeDir() // 当前用户目录  
File System.getUserDir() // 启动java进程时所在的目录

5.Boolean类型反转,空指针安全,参与位运算

Boolean Booleans.negate(Boolean booleanObj)
True => False , False => True, Null => Null
boolean Booleans.and(boolean[] array)
boolean Booleans.or(boolean[] array)
boolean Booleans.xor(boolean[] array)
boolean Booleans.and(Boolean[] array)
boolean Booleans.or(Boolean[] array)
boolean Booleans.xor(Boolean[] array)

6.两个char间的equals 

boolean Character.equalsIgnoreCase(char ch1, char ch2)

7.安全的加减乘除 

int Math.safeToInt(long value)  
int Math.safeNegate(int value)  
long Math.safeSubtract(long value1, int value2)  
long Math.safeSubtract(long value1, long value2)  
int Math.safeMultiply(int value1, int value2)  
long Math.safeMultiply(long value1, int value2)  
long Math.safeMultiply(long value1, long value2)  
long Math.safeNegate(long value)  
int Math.safeAdd(int value1, int value2)  
long Math.safeAdd(long value1, int value2)  
long Math.safeAdd(long value1, long value2)  
int Math.safeSubtract(int value1, int value2)  

8.map集合支持并发请求,且可以写成 Map map = {name:"xxx",age:18};

+------除此之外还有--------+

1.模块化特性
Java7也是采用了模块的划分方式来提速,一些不是必须的模块并没有下载和安装,当虚拟机需要的时候,再下载相应的模块,同时对启动速度也有了很大的改善。
2.多语言支持
Java7的虚拟机对多种动态程序语言增加了支持,比如:Rubby、 Python等等。
3.执行效率的提高
对对象指针由64位压缩到与32位指针相匹配的技术使得内存和内存带块的消耗得到了很大的降低因而提高了执行效率。
提供了新的垃圾回收机制(G1)来降低垃圾回收的负载和增强垃圾回收的效果。

jdk1.8的新特性

lambda表达式,多重Annotation

1. 允许在接口中有默认方法实现

Java 8允许给接口添加一个非抽象的方法实现,需要使用 default关键字,这个特征又叫做扩展方法,示例如下:

interface Formula {  
    double calculate(int a);    
	default double sqrt(int a) {  
		return Math.sqrt(a);  
    }  
}  

2. Lambda表达式

首先看看在老版本的Java中是如何排列字符串的:

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");    
Collections.sort(names, new Comparator<String>() {  
    @Override  
    public int compare(String a, String b) {  
        return b.compareTo(a);  
    }  
});  

只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:

Collections.sort(names, (String a, String b) -> {  
    return b.compareTo(a);  
}); 

看到了吧,代码变得更短且更具有可读性,但是实际上还可以写得更短:

Collections.sort(names, (String a, String b) -> b.compareTo(a)); 

还可以写得更短:

Collections.sort(names, (a, b) -> b.compareTo(a)); 

Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型。接下来我们看看lambda表达式还能作出什么更方便的东西来:


3. 函数式接口

Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。

我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。

@FunctionalInterface  
interface Converter<F, T> {  
    T convert(F from);  
}  
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);  
Integer converted = converter.convert("123");  
System.out.println(converted);    // 123  

需要注意如果@FunctionalInterface如果没有指定,上面的代码也是对的。

4. 方法和构造函数引用

上边的代码还可以通过静态方法引用来表示:

Converter<String, Integer> converter = Integer::valueOf;  
Integer converted = converter.convert("123");  
System.out.println(converted);   // 123  

Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用,上面的代码展示了如何引用一个静态方法,我们也可以引用一个对象的方法:

converter = something::startsWith;  
String converted = converter.convert("Java");  
System.out.println(converted);    // "J" 

接下来看看构造函数是如何使用::关键字来引用的,首先我们定义一个包含多个构造函数的简单类:

class Person {  
    String firstName;  
    String lastName;    
    Person() {}   
    Person(String firstName, String lastName) {  
        this.firstName = firstName;  
        this.lastName = lastName;  
    }  
}   

接下来我们指定一个用来创建Person对象的对象工厂接口:

interface PersonFactory<P extends Person> {  
    P create(String firstName, String lastName);  
}  

这里我们使用构造函数引用来将他们关联起来,而不是实现一个完整的工厂:

PersonFactory<Person> personFactory = Person::new;  
Person person = personFactory.create("Peter", "Parker");  

我们使用 Person::new 来获取Person类构造函数的引用,Java编译器会自动根据PersonFactory.create方法的签名来选择合适的构造函数。
5. Lambda的范围

在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。
6. 内置函数式接口

Predicate,Function ,Supplier ,Consumer ,Comparator ,Optional ,Stream 接口
7. Streams
8. Parallel Streams
9. Map
10. 时间日期API

11. Annotations注解

在Java 8中支持多重注解了,先看个例子来理解一下是什么意思。
首先定义一个包装类Hints注解用来放置一组具体的Hint注解:

@interface Hints {  
    Hint[] value();  
}    
@Repeatable(Hints.class)  
@interface Hint {  
    String value();  
}   

Java 8允许我们把同一个类型的注解使用多次,只需要给该注解标注一下@Repeatable即可。

例 1: 使用包装类当容器来存多个注解(老方法)

@Hints({@Hint("hint1"), @Hint("hint2")})  
class Person {} 

例 2:使用多重注解(新方法)

@Hint("hint1")  
@Hint("hint2")  
class Person {}  

第二个例子里java编译器会隐性的帮你定义好@Hints注解,了解这一点有助于你用反射来获取这些信息:

jdk1.9的新特性

1. Jigsaw 项目;模块化源码
2. 简化进程API 
3. 轻量级 JSON API 
4. 钱和货币的API 
5. 改善锁争用机制
6. 代码分段缓存
7. 智能Java编译, 第二阶段
8. HTTP 2.0客户端
9. Kulla计划: Java的REPL实现
 

参考:

Java 8 的 lambda 表达式

Java 9的14个新特性总结

Java9 新特性 详解

Java8 lambda表达式10个示例

猜你喜欢

转载自my.oschina.net/anlve/blog/1627927
今日推荐