java 1.7 1.8新特性

在JDK1.7的新特性方面主要有下面几方面的加强:
1.jdk7语法上
1.1二进制变量的表示,支持将整数类型用二进制来表示,用0b开头。
1.2 Switch语句支持string类型
1.3 Try-with-resource语句
注意:实现java.lang.AutoCloseable接口的资源均可以放到try中,跟final里面的关闭资源相似; 按照声明逆序关闭资源 ;Try块抛出的异常经过Throwable.getSuppressed获取
1.4 Catch多个异常 说明:Catch异常类型为final; 生成Bytecode 会比多个catch小; Rethrow时保持异常类型
1.5 数字类型的下划线表示 更友好的表示方式,不过要注意下划线添加的一些标准
1.6 泛型实例的建立能够经过类型推断来简化 能够去掉后面new部分的泛型类型,只用<>就能够了
1.7在可变参数方法中传递非具体化参数,改进编译警告和错误
1.8 信息更丰富的回溯追踪 就是上面try中try语句和里面的语句同时抛出异常时,异常栈的信息
2. NIO2的一些新特性
1.java.nio.file 和java.nio.file.attribute包 支持更详细属性,好比权限,全部者
2. symbolic and hard links支持
3. Path访问文件系统,Files支持各类文件操做
4.高效的访问metadata信息
5.递归查找文件树,文件扩展搜索
6.文件系统修改通知机制
7.File类操做API兼容
8.文件随机访问加强 mapping a region,locl a region,绝对位置读取
9. AIO Reactor(基于事件)和Proactor
2.1IO and New IO 监听文件系统变化通知
经过FileSystems.getDefault().newWatchService()获取watchService,而后将须要监听的path目录注册到这个watchservice中,对于这个目录的文件修改,新增,删除等实践能够配置,而后就自动能监听到响应的事件。
2.2 IO and New IO遍历文件树 ,经过继承SimpleFileVisitor类,实现事件遍历目录树的操做,而后经过Files.walkFileTree(listDir, opts, Integer.MAX_VALUE, walk);这个API来遍历目录树
2.3 AIO异步IO 文件和网络 异步IO在java
NIO2实现了,都是用AsynchronousFileChannel,AsynchronousSocketChanne等实现,关于同步阻塞IO,同步非阻塞IO,异步阻塞IO和异步非阻塞IO。Java NIO2中就实现了操做系统的异步非阻塞IO。
3. JDBC 4.1
3.1.可使用try-with-resources自动关闭Connection, ResultSet, 和 Statement资源对象
3.2. RowSet 1.1:引入RowSetFactory接口和RowSetProvider类,能够建立JDBC driver支持的各类 row sets,这里的rowset实现其实就是将sql语句上的一些操做转为方法的操做,封装了一些功能。
3.3. JDBC-ODBC驱动会在jdk8中删除
4. 并发工具加强
4.1.fork-join
最大的加强,充分利用多核特性,将大问题分解成各个子问题,由多个cpu能够同时解决多个子问题,最后合并结果,继承RecursiveTask,实现compute方法,而后调用fork计算,最后用join合并结果。
4.2.ThreadLocalRandon 并发下随机数生成类,保证并发下的随机数生成的线程安全,实际上就是使用threadlocal
4.3. phaser 相似cyclebarrier和countdownlatch,不过能够动态添加资源减小资源
5. Networking加强

新增URLClassLoader close方法,能够及时关闭资源,后续从新加载class文件时不会致使资源被占用或者没法释放问题
URLClassLoader.newInstance(new URL[]{}).close();
新增Sockets Direct Protocol
绕过操做系统的数据拷贝,将数据从一台机器的内存数据经过网络直接传输到另一台机器的内存中
6. Multithreaded Custom Class Loaders
解决并发下加载class可能致使的死锁问题,这个是jdk1.6的一些新版本就解决了,jdk7也作了一些优化。有兴趣能够仔细从官方文档详细了解

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

return b.compareTo(a);

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

String converted = converter.convert("Java");

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