哪些jdk版本比较好用?

JDK5

自动包装和拆包:

列举

静态导入,比如:导入静态java.lang.system.out。

Varargs(可变参数)

Introspector,主要用于通过getXxx/setXxx操作JavaBean中的属性。一般的做法是通过Introspector类获取一个对象的BeanInfo信息,然后通过BeanInfo获取PropertyDescriptor。通过这个属性描述符,我们可以得到一个属性对应的getter/setter方法,然后通过反射机制调用这些方法。

泛型(包括通配符类型/边界类型等。)

For-Each循环

给…作注解

协变返回类型:实际返回类型可以是所需返回类型的子类型。

JDK6

1.AWT新增了两个类:Desktop和SystemTray,其中前者用于通过系统默认程序执行一个操作,比如用默认浏览器浏览指定URL,用默认邮件客户端发送邮件到指定邮箱,用默认应用打开或编辑文件(比如用记事本打开带有txt后缀的文件),用系统默认打印机打印文档。后者可以用来在系统托盘区创建一个托盘程序。(开发中基本不用)

2.使用JAXB2实现对象和XML之间的映射,可以将一个Java对象转换成XML格式,反之亦然。

3.StAX,一个用于拉解析的API)XML文档。与SAX类似,它也是基于事件驱动的模型。StAX被加入JAXP家族,因为它将用于JAXB2和JDK6中的JAX-WS 2.0。

4.使用编译器API动态编译Java源文件,比如JSP编译引擎是动态的,修改后不需要重启服务器。(从这里我才知道可以动态编译)

5.轻量级Http Server API,从中可以构建自己的嵌入式Http Server,它支持Http和Https协议。

6.插件注释处理API(可插拔注释处理API)

7.Console类用于开发控制台程序,该程序位于java.io包中。所以在Windows下和cmd交互或者在Linux下和终端交互都很方便。

8.支持ruby、groovy、javascript等脚本语言。

9.通用注释最初是J2EE 5.0规范的一部分,现在被放到了J2SE 6.0中。

10.嵌入式数据库Derby(这个刚刚知道,基本没用过)

JDK7

1.增强了对Java集合的支持,可以直接以[]和{}的形式存储对象,并根据[]形式的索引和键值获取集合中的对象。比如:

列表& lt字符串& gtlist=["item1 "," item 2 "];//保存

string item = list[0];//直接拿

设置& lt字符串& gtset={"item1 "," item2 "," item 3 " };//保存

地图& ltString,Integer & gtmap={"key1":1," key 2 ":2 };//保存

int value = map[" key 1 "];//取12345

2.字符串可用于开关。

3.值可以加下划线作为分隔符(编译时自动忽略)。

4.支持二进制数,比如int binary = 0b 1001 _ 1001;

5.简化变参数方法的调用。

6.调用泛型类的构造函数时,可以省略泛型参数,编译器会自动判断。

7.布尔类型反转、空指针安全和位操作。

8.8.char类型的equals方法:布尔字符。等于ignorecase (charch1,charch2)。

9.安全加减乘除:math . safe toint(longv);math . safe negate(int v);Math.safeSubtract(long v1,int v2);Math.safeMultiply(int v1,int v2)……

10 .地图收集支持并发请求。注意HashTable是线程安全的,Map是非线程安全的。但是这里的更新使它也支持并发。另外,Map对象可以定义为:Map Map = { name:“XXX”,age:18 };

JDK8

1.接口的默认方法:可以将一个非抽象方法声明为接口中的默认实现,但只能声明一个方法,并且要在方法的返回类型前加上关键字“default”。

2.Lambda表达式:是匿名比较器的简化,比如:

Collections.sort(名称,(字符串a,字符串b)-& gt;{ returnb . compare to(a);});1

对于只有一行代码的函数体,可以去掉大括号{}和return关键字。如:1

Collections.sort(名称,(字符串a,字符串b)-& gt;b .比较(a));

Or: collections.sort (names,(a,b)-> b . compare to(a));123

3.函数接口:指只包含一个抽象方法的接口,需要用@FunctionalInterface进行注释。

4.使用::关键字传递方法或构造函数引用。

5.多重注释

6.增加了许多类似于函数接口的接口和与地图相关的API...

JDK9

jdk1.9的新特性

1,Java平台级模块系统

当启动一个模块化的应用程序时,JVM会验证是否所有的模块都可以使用,这是基于?要求?语句——从脆弱的类路径向前迈进了一大步。模块允许您更好地强制应用程序的结构化打包,并定义依赖关系。

2.连接

当您使用具有显式依赖关系和模块化JDK的模块时,新的可能性就会出现。您的应用程序模块现在将声明它对其他应用程序模块以及它所使用的JDK模块的依赖性。为什么不使用这些信息来创建一个最小的运行时环境,只包含运行应用程序所需的那些模块呢?这可以通过Java 9中新的jlink工具来实现。您可以创建针对您的应用程序优化的最小运行时映像,而无需使用完全加载的JDK安装。

3.JShell:交互式Java REPL

许多语言已经有了交互式编程环境,Java现在也加入了这个俱乐部。可以从控制台启动jshell,直接启动Java代码的输入和执行。Jshell的即时反馈使其成为探索API和尝试语言特性的好工具。

4.改进的Javadoc

Javadoc现在支持在API文档中搜索。此外,Javadoc的输出现在符合兼容的HTML5标准。此外,您会注意到每个Javadoc页面都包含关于JDK模块类或接口的源代码的信息。

5.装配工厂法

通常,您希望在代码中创建一个集合(例如,List或Set ),并直接用一些元素填充它。实例化集合,几次“添加”调用,使得代码重复。Java 9,增加了几个集合工厂方法:

设置& lt整数& gt?ints = Set.of(1,2,3);列表& lt字符串& gt?strings = List.of("first "," second ");123

除了更短、更容易阅读之外,这些方法还可以防止您选择特定的集合实现。事实上,从工厂方法返回几个元素的集合实现是高度优化的。这是可能的,因为它们是不可变的:创建后,继续向这些集合添加元素会导致“UnsupportedOperationException”。

6.改进的流API

长期以来,Stream API是Java标准库最好的改进之一。通过这个API,您可以为集合上的转换建立一个声明管道。在Java 9中会变得更好。Stream接口中增加了四个新方法:dropWhile、takeWhile、ofNullable。iterate方法还有一个新的重载方法,它允许您提供一个谓词来指定何时结束迭代:

IntStream.iterate(1,I-& gt;我& lt100,I-& gt;i + 1)。forEach(system . out::println);1

第二个参数是Lambda,当当前IntStream中的元素达到100时,它将返回true。所以这个简单的例子就是把1到99打印到控制台。

除了Stream本身的扩展,Optional和Stream之间的组合也得到了改进。现在你可以使用可选的新方法了吗?斯特拉姆?将可选对象转换为(可能为空的)流对象:

Stream & lt整数& gt?s = Optional.of(1)。stream();1

当组成复杂的流管道时,将可选转换为流非常有用。

7.私有接口方法

使用Java 9,您可以通过向接口添加私有辅助方法来解决这个问题:

公共接口MyInterface {

voidnormalInterfaceMethod();

默认void interface methodwithdefault(){?init();}

default void another default method(){ init();}此方法不是MyInterface公开的公共API的一部分

privatevoidinit(){ system . out . println(" Initializing ");

}}12345678910111213

如果使用默认方法开发API,那么私有接口方法可能有助于构建其实现。

8.HTTP/2

Java 9中有新的方法来处理HTTP调用。这个后期功能是用来代替老的吗?HttpURLConnection?API,并提供对WebSocket和HTTP/2的支持。注意:新的HttpClient API是作为Java 9中所谓的孵化器模块提供的。换句话说,这个API不能保证100%完成。但是您可以在Java 9中开始使用这个API:

http client client = http client . newhttpclient();HttpRequest req =?http request . new builder(uri . create(" ")。头("用户代理"," Java ")。获取()。build();HttpResponse & lt字符串& gt?resp = client.send(req,tpResponse。body handler . asstring());HttpResponse & lt字符串& gtresp = client.send(req,HttpResponse。body handler . asstring());1234

除了这个简单的请求/响应模型,HttpClient还提供了一个新的API来处理HTTP/2的特性,比如流和服务器端推送。

9.多版本兼容JAR

我们想要关注的最后一个特性对于库的维护者来说是个好消息。当一个新版本的Java出现时,你的图书馆用户将花费数年时间切换到这个新版本。这意味着这个库必须向后兼容您想要支持的最老的Java版本(在许多情况下,是Java 6或7)。这实际上意味着在未来很长一段时间内,你都无法在库中使用Java 9提供的新特性。幸运的是,多版本兼容的JAR特性允许您创建一个class版本,只有当运行时程序处于特定版本的Java环境中时,您才可以选择使用这个版本:

多释放. jar

├──

元信息

└──版本

└── 9

└──多重释放

└──助手. class

├──

多重释放

├──1

Helper.class

└──1

Main.class

在上面的场景中,可以在Java 9中使用multirelease.jar,但是Helper类不使用顶级的multirelease。Helper类,而是“META-INF/versions/9”下的那个。这是专门为Java 9准备的类版本,可以使用Java 9提供的特性和库。同时,在早期的Java版本中使用这个JAR也可以运行,因为旧版本的Java只会在顶部看到Helper类。