JDK各版本的新特性java
1、jdk1.5的新特性正则表达式
1. 泛型shell
[Java]纯文本查看__复制代码编程
?数组
1安全
2多线程
ArrayList list=
`new
ArrayList();`并发
------>ArrayList<Integer>list=
`new
ArrayList<Integer>();`框架
2. 自动装箱/拆箱异步
[Java]纯文本查看__复制代码
1
2
int
i=list.get(
`0`).parseInt();
-------->
`int
i=list.get(0
);`
原始类型与对应的包装类不用显式转换
3. for-each
[Java]纯文本查看__复制代码
1
2
3
for
`( i=0
;i<a.length;i++){......}`
------------>
`for(
int
i:a){......}`
4 static import
Math.sqrt();--------------->sqrt();
5 变长参数(可变参数)
int sum(int ...intlist)有任意个参数,把他看做数组
2、jdk1.6的新特性
1.加强的for循环语句
[Java]纯文本查看__复制代码
1
2
3
4
5
6
7
8
Integer[] numbers = computeNumbers();
int
sum =
0
`;`
for
(
`int
i=0
; i < numbers.length ; i++)`
sum += numbers[i];
||
int
sum =
0
`;`
for
(
int
number: computeNumbers() )
sum += number;
_
2.监视和管理
Java SE 6中对内存泄漏加强了分析以及诊断能力。当遇到java.lang.OutOfMemory异常的时候,能够获得一个完整的堆栈信息,
而且当堆已经满了的时候,会产生一个Log文件来记录这个致命错误。另外,JVM还添加了一个选项,容许你在堆满的时候运行脚本。
3.插入式注解处理
插入式注解处理API(JSR 269)提供一套标准API来处理Annotations
4.安全性
_
3、jdk1.7的新特性
_
1.模块化特性
Java7也是采用了模块的划分方式来提速,一些不是必须的模块并无下载和安装,当虚拟机须要的时候,再下载相应的模块,同时对启动速度也有了很大的改善。
2.多语言支持
Java7的虚拟机对多种动态程序语言增长了支持,好比:Rubby、 Python等等。
3.开发者的开发效率获得了改善
switch中可使用字符串
在多线程并发与控制方面:轻量级的分离与合并框架,一个支持并发访问的HashMap等等。
经过注解加强程序的静态检查。
提供了一些新的API用于文件系统的访问、异步的输入输出操做、Socket通道的配置与绑定、多点数据包的传送等等。
4.执行效率的提升
对对象指针由64位压缩到与32位指针相匹配的技术使得内存和内存带块的消耗获得了很大的下降于是提升了执行效率。
提供了新的垃圾回收机制(G1)来下降垃圾回收的负载和加强垃圾回收的效果。
_
4、JDK1.8的新特性:、
_
一、接口的默认方法
Java 8容许咱们给接口添加一个非抽象的方法实现,只须要使用default关键字便可,这个特征又叫作扩展方法。
二、Lambda 表达式
在Java 8 中你就不必使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:
[Java]纯文本查看__复制代码
1
2
3
Collections.sort(names, (String a, String b) -> {
return
b.compareTo(a);
});
三、函数式接口
Lambda表达式是如何在java的类型系统中表示的呢?每个lambda表达式都对应一个类型,一般是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每个该类型的lambda表达式都会被匹配到这个抽象方法。由于 默认方法 不算抽象方法,因此你也能够给你的函数式接口添加默认方法。
四、方法与构造函数引用
Java 8 容许你使用 :: 关键字来传递方法或者构造函数引用,上面的代码展现了如何引用一个静态方法,咱们也能够引用一个对象的方法:
[Java]纯文本查看__复制代码
1
2
3
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上使用的。
_
5、JDK1.9 新特性
1. Java 平台级模块系统
Java 9 的定义功能是一套全新的模块系统。当代码库愈来愈大,建立复杂,盘根错节的“意大利面条式代码”的概率呈指数级的增加。这时候就得面对两个基础的问题: 很难真正地对代码进行封装, 而系统并无对不一样部分(也就是 JAR 文件)之间的依赖关系有个明确的概念。每个公共类均可以被类路径之下任何其它的公共类所访问到, 这样就会致使无心中使用了并不想被公开访问的 API。此外,类路径自己也存在问题: 你怎么知晓全部须要的 JAR 都已经有了, 或者是否是会有重复的项呢? 模块系统把这俩个问题都给解决了。
模块化的 JAR 文件都包含一个额外的模块描述器。在这个模块描述器中, 对其它模块的依赖是经过 “requires” 来表示的。另外, “exports” 语句控制着哪些包是能够被其它模块访问到的。全部不被导出的包默认都封装在模块的里面。以下是一个模块描述器的示例,存在于 “module-info.java” 文件中:
_
[Java]纯文本查看__复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
module
blog {
exports
com.pluralsight.blog;
requires
cms;
}
_
咱们能够以下展现模块:
请注意,两个模块都包含封装的包,由于它们没有被导出(使用橙色盾牌可视化)。 没有人会偶然地使用来自这些包中的类。Java 平台自己也使用本身的模块系统进行了模块化。经过封装 JDK 的内部类,平台更安全,持续改进也更容易。
当启动一个模块化应用时, JVM 会验证是否全部的模块都能使用,这基于 `requires` 语句——比脆弱的类路径迈进了一大步。模块容许你更好地强制结构化封装你的应用并明确依赖。你能够在这个课程中学习更多关于 Java 9 中模块工做的信息 。
2. Linking
当你使用具备显式依赖关系的模块和模块化的 JDK 时,新的可能性出现了。你的应用程序模块如今将声明其对其余应用程序模块的依赖以及对其所使用的 JDK 模块的依赖。为何不使用这些信息建立一个最小的运行时环境,其中只包含运行应用程序所需的那些模块呢? 这能够经过 Java 9 中的新的 jlink 工具实现。你能够建立针对应用程序进行优化的最小运行时映像而不须要使用彻底加载 JDK 安装版本。
3. JShell : 交互式 Java REPL
许多语言已经具备交互式编程环境,Java 如今加入了这个俱乐部。您能够从控制台启动 jshell ,并直接启动输入和执行 Java 代码。 jshell 的即时反馈使它成为探索 API 和尝试语言特性的好工具。
测试一个 Java 正则表达式是一个很好的说明 jshell 如何使您的生活更轻松的例子。 交互式 shell 还能够提供良好的教学环境以及提升生产力,您能够在此了解更多信息。在教人们如何编写 Java 的过程当中,再也不须要解释 “public static void main(String [] args)” 这句废话。
4. 改进的 Javadoc
有时一些小事情能够带来很大的不一样。你是否就像我同样在一直使用 Google 来查找正确的 Javadoc 页面呢? 这再也不须要了。Javadoc 如今支持在 API 文档中的进行搜索。另外,Javadoc 的输出如今符合兼容 HTML5 标准。此外,你会注意到,每一个 Javadoc 页面都包含有关 JDK 模块类或接口来源的信息。
5. 集合工厂方法
一般,您但愿在代码中建立一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 “add” 调用,使得代码重复。 Java 9,添加了几种集合工厂方法:
_
[Java]纯文本查看__复制代码
1
2
3
Set<Integer> ints = Set.of(
`1,
2,
3`);
List<String> strings = List.of(
`"first",
"second"`);
_
除了更短和更好阅读以外,这些方法也能够避免您选择特定的集合实现。 事实上,从工厂方法返回已放入数个元素的集合实现是高度优化的。这是可能的,由于它们是不可变的:在建立后,继续添加元素到这些集合会致使 “UnsupportedOperationException” 。
6. 改进的 Stream API
长期以来,Stream API 都是 Java 标准库最好的改进之一。经过这套 API 能够在集合上创建用于转换的申明管道。在 Java 9 中它会变得更好。Stream 接口中添加了 4 个新的方法:dropWhile, takeWhile, ofNullable。还有个 iterate 方法的新重载方法,可让你提供一个 Predicate (判断条件)来指定何时结束迭代:
_
[Java]纯文本查看__复制代码
1
IntStream.iterate(
`1,i -> i <
100,i -> i +
1`).forEach(System.out::println);
_
第二个参数是一个 Lambda,它会在当前 IntStream 中的元素到达 100 的时候返回 true。所以这个简单的示例是向控制台打印 1 到 99。
除了对 Stream 自己的扩展,Optional 和 Stream 之间的结合也获得了改进。如今能够经过 Optional 的新方法 `stram` 将一个 Optional 对象转换为一个(多是空的) Stream 对象:
_
[Java]纯文本查看__复制代码
1
Stream<Integer> s = Optional.of(
`1`).stream();
_
在组合复杂的 Stream 管道时,将 Optional 转换为 Stream 很是有用。
7. 私有接口方法
Java 8 为咱们带来了接口的默认方法。 接口如今也能够包含行为,而不只仅是方法签名。 可是,若是在接口上有几个默认方法,代码几乎相同,会发生什么状况? 一般,您将重构这些方法,调用一个可复用的私有方法。 但默认方法不能是私有的。 将复用代码建立为一个默认方法不是一个解决方案,由于该辅助方法会成为公共API的一部分。 使用 Java 9,您能够向接口添加私有辅助方法来解决此问题:
public interface MyInterface{
void normalInterfaceMethod();
default void interfaceMethodWithDefault(){ init(); }
default void anotherDefaultMethod(){ init(); }
//This method is not part of the public API exposed by MyInterface
private void init(){ System.out.println("Initializing");}
}
8. HTTP/2
Java 9 中有新的方式来处理 HTTP 调用。这个迟到的特性用于代替老旧的 `HttpURLConnection` API,并提供对 WebSocket 和 HTTP/2 的支持。注意:新的 HttpClient API 在 Java 9 中以所谓的孵化器模块交付。也就是说,这套 API 不能保证 100% 完成。不过你能够在 Java 9 中开始使用这套 API:
_
[Java]纯文本查看__复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
HttpClient client = HttpClient.newHttpClient();
HttpRequest req =HttpRequest
.newBuilder(URI.create(
`"http://www.google.com"`))
.header(
`"User-Agent",
"Java"`)
.GET()
.build();
HttpResponse<String>resp = client.send(req, HttpResponse.BodyHandler.asString());
_
除了这个简单的请求/响应模型以外,HttpClient 还提供了新的 API 来处理 HTTP/2 的特性,好比流和服务端推送。
9. 多版本兼容 JAR
咱们最后要来着重介绍的这个特性对于库的维护者而言是个特别好的消息。当一个新版本的 Java 出现的时候,你的库用户要花费数年时间才会切换到这个新的版本。这就意味着库得去向后兼容你想要支持的最老的 Java 版本 (许多状况下就是 Java 6 或者 7)。这实际上意味着将来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。幸运的是,多版本兼容 JAR 功能能让你建立仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本:
_
[Java]纯文本查看__复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
multirelease.jar
├──
META-INF
└─ versions
└─
`9`
└─ multirelease
└─ Helper.
`class`
├──
multirelease
├──
Helper.
`class`
└─ Main.
`class`
_
在上述场景中, multirelease.jar 能够在 Java 9 中使用, 不过 Helper 这个类使用的不是顶层的 multirelease.Helper 这个 class, 而是处在“META-INF/versions/9”下面的这个。这是特别为 Java 9 准备的 class 版本,能够运用 Java 9 所提供的特性和库。同时,在早期的 Java 诸版本中使用这个 JAR 也是能运行的,由于较老版本的 Java 只会看到顶层的这个 Helper 类。
6、JDK10 新特性
1. 新增局部变量类型推断 var
_
[Java]纯文本查看__复制代码
1
2
3
var a =
"aa"
`;`
System.out.println(a);
_
var 关键字目前只能用于局部变量以及 for 循环变量声明中。
2. 删除工具 javah
从JDK中移除了 javah 工具,使用 javac -h 代替。
3. 统一的垃圾回收接口,改进了 GC 和其余内务管理
4. 其余新特性
ThreadLocal 握手交互 JDK 10 引入一种在线程上执行回调的新方法,很方便的中止单个线程而不是中止所有线程或者一个都不停。
基于Java的实验性JIT编译器 Java 10 开启了 Java JIT编译器 Graal,用做Linux / x64平台上的实验性JIT编译器。
提供默认的 CA 根证书
将 JDK 生态整合到单个仓库 此JEP的主要目标是执行一些内存管理,并将JDK生态的众多存储库组合到一个存储库中。
7、JDK11 新特性
1. Lambda 表达式中使用 var
(var x, var y) -> x.process(y)
2. 字符串 API 加强
Java 11 新增了 一系列字符串处理方法,例如:
_
[Java]纯文本查看__复制代码
1
2
3
4
5
6
7
// 判断字符串是否为空白
" "
`.isBlank;`
" Javastack "
`.stripTrailing;
// " Javastack"`
" Javastack "
`.stripLeading;
// "Javastack "`
_
3. 标准化 HTTPClient API
4. java 命令直接编译运行 java
省去中间步骤 javac 生成 class 文件。
5. 增长对 TLS 1.3 的支持
JDK12 新特性
switch 表达式
Java 12 之后,switch 不只能够做为语句,也能够做为表达式。
_
[Java]纯文本查看__复制代码
01
02
03
04
05
06
07
08
09
10
11
private
String switchTest(
int
i ){
return
switch
`( i ) {`
case
1
`->
"1"`;
default
`->
"0"`;
};
}
_