您现在的位置是:群英 > 开发技术 > 编程语言
JDK1.7和1.8的区别有什么,你了解多少?
Admin发表于 2022-01-26 18:40:083199 次浏览

    JDK1.7和1.8的区别有什么?JDK 也就是Java开发工具包,这篇文章我们主要来了解JDK1.7和1.8的不同,对大家选择合适的JDK会有帮助,文中示例介绍的很详细,感兴趣的朋友可以了解看看,下面让我们一起来学习一下吧!

    jdk1.7与jdk1.8对比

    1. jdk1.7语法上

    1) 可以用二进制来表示整数,用0b开头。

    2) Switch语句支持string类型

    3) try块可以不用finally手动关闭,直接try块中就可以关闭

    4) Catch多个异常 说明:Catch异常类型为final所以不能被修改。这一特性将生成更少的字节码并减少代码冗余。重新抛异常时保持异常类型。

    5) 可在数字中使用下划线,更加友好。但要注意下划线添加规则,下划线只能在数字之间,在数字的开始或结束一定不能使用下划线。

    6) 创建泛型实例时,会根据变量声明时的泛型类型自动推断出实例的泛型类型。

    7) 在可变参数方法中传递非具体化参数,改进编译警告和错误。

    8) 信息更丰富的回溯追踪。

    2. NIO2的一些新特性

    1) 实现了异步非阻塞IO和Proactor

    2) 递归查找文件树,文件扩展搜索

    3. Jdbc

    1) 可以使用try-with-resources自动关闭Connection, ResultSet,和 Statement资源对象。

    2) RowSet1.1(接口模型):引入RowSetFactory接口和RowSetProvider类,可以创建JDBC driver支持的各种 row sets,这里的rowset实现其实就是将sql语句上的一些操作转为方法的操作,封装了一些功能。

    3) JDBC-ODBC驱动会在jdk8中删除。

    4. 并发工具增强

    1) fork-join,Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。(充分利用多核特性,将大问题分解成各个子问题,由多个cpu可以同时解决多个子问题,最后合并结果)。

    2) ThreadLocalRandon并发下随机数生成类,保证并发下的随机数生成的线程安全,实际上就是使用threadlocal。

    3) phaser类

    java5有一个并发包。里面有semaphore(信号量)、CountDownLatch(闭锁)、CyclicBarrier(栅栏)。phaser 类优化了CountDownLatch和CyclicBarrier。

    信号量:信号量就是可以声明多把锁(包括一把锁:此时为互斥信号量)。

    举个例子:一个房间如果只能容纳5个人,多出来的人必须在门外面等着。如何去做呢?一个解决办法就是:房间外面挂着五把钥匙,每进去一个人就取走一把钥匙,没有钥匙的不能进入该房间而是在外面等待。每出来一个人就把钥匙放回原处以方便别人再次进入。

    主要用来控制能够访问的最大线程数。默认是非公平的。可以通过构造器显示声明锁的公平性。

    闭锁:

    含义:CountDownLatch可以理解为一个计数器在初始化时设置初始值,当一个线程需要等待某些操作先完成时,需要调用await()方法。这个方法让线程进入休眠状态直到等待的所有线程都执行完成。每调用一次countDown()方法内部计数器减1,直到计数器为0时唤醒。这个可以理解为特殊的CyclicBarrier。线程同步点比较特殊,为内部计数器值为0时开始。

    方法:核心方法两个:countDown()和await()。countDown():使CountDownLatch维护的内部计数器减1,每个被等待的线程完成的时候调用。

    await():线程在执行到CountDownLatch的时候会将此线程置于休眠

    例子:开会的例子:会议室里等与会人员到齐了会议才能开始。

    栅栏:

    含义:栅栏允许两个或者多个线程在某个集合点同步。当一个线程到达集合点时,它将调用await()方法等待其它的线程。线程调用await()方法后,CyclicBarrier将阻塞这个线程并将它置入休眠状态等待其它线程的到来。等最后一个线程调用await()方法时,CyclicBarrier将唤醒所有等待的线程然后这些线程将继续执行。CyclicBarrier可以传入另一个Runnable对象作为初始化参数。当所有的线程都到达集合点后,CyclicBarrier类将Runnable对象作为线程执行。

    方法:await():使线程置入休眠直到最后一个线程的到来之后唤醒所有休眠的线程。

    与CountDownLatch的区别:

    在所有线程到达集合点后接受一个Runnable类型的对象作为后续的执行

    没有显示调用CountDown()方法

    CountDownLatch一般只能使用一次,CyclicBarrier可以多次使用

    应用场景:多个线程做任务,等到达集合点同步后交给后面的线程做汇总。

    Phaser:

    含义:更加复杂和强大的同步辅助类。它允许并发执行多阶段任务。当我们有并发任务并且需要分解成几步执行时,(CyclicBarrier是分成两步),就可以选择使用Phaser。Phaser类机制是在每一步结束的位置对线程进行同步,当所有的线程都完成了这一步,才允许执行下一步。跟其他同步工具一样,必须对Phaser类中参与同步操作的任务数进行初始化,不同的是,可以动态的增加或者减少任务数。

函数:arriveAndAwaitAdvance():类似于CyclicBarrier的await()方法,等待其它线程都到来之后同步继续执行。arriveAndDeregister():把执行    到此的线程从Phaser中注销掉。isTerminated():判断Phaser是否终止。register():将一个新的参与者注册到Phaser中,这个新的参与者将被当成没有执行完本阶段的线程。forceTermination():强制Phaser进入终止态

    例子:使用Phaser类同步三个并发任务。这三个任务将在三个不同的文件夹及其子文件夹中查找过去24小时内修改过扩展为.log的文件。这个任务分成以下三个步骤:查找文件、过滤文件、打印结果。并且在查找文件和过滤文件结束后对结果进行分析,如果是空的,将此线程从Phaser中注销掉。也就是说,下一阶段,该线程将不参与运行。在run()方法中,开头调用了phaser的arriveAndAwaitAdvance()方法来保证所有线程都启动了之后再开始查找文件。在查找文件和过滤文件阶段结束之后,都对结果进行了处理。即:如果结果是空的,那么就把该条线程移除,如果不空,那么等待该阶段所有线程都执行完该步骤之后在统一执行下一步。最后,任务执行完后,把Phaser中的线程均注销掉。

    Phaser其实有两个状态:活跃态和终止态。当存在参与同步的线程时,Phaser就是活跃的。并且在每个阶段结束的时候同步。当所有参与同步的线程都取消注册的时候,Phase就处于终止状态。在这种状态下,Phaser没有任务参与者。

    Phaser主要功能就是执行多阶段任务,并保证每个阶段点的线程同步。在每个阶段点还可以条件或者移除参与者。主要涉及方法arriveAndAwaitAdvance()和register()和arriveAndDeregister()。

    4) Networking增强

    新增URLClassLoader close方法,可以及时关闭资源,后续重新加载class文件时不会导致资源被占用或者无法释放问题。

    5) MultithreadedCustom Class Loaders

    解决并发下加载class可能导致的死锁问题,这个是jdk1.6的一些新版本就解决了,jdk7也做了一些优化。

    Java1.8

    1. 接口的默认方法

    Java1.8以前,接口里的方法要求全部是抽象方法,java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可。

    2. lambda表达式

    它将允许我们将行为传到函数里。在Java 8之前,如果想将行为传入函数,仅有的选择就是匿名类,需要6行代码。而定义行为最重要的那行代码,却混在中间不够突出。Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码。这样有时可读性更好,表达更清晰。

    3. 函数式接口

    如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。一个函数式接口非常有价值的属性就是他们能够用lambdas来实例化。

    4. 方法与构造函数引用

    使用关键字来传递方法或者构造函数引用。

    5. Lambda作用域

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

    6. 访问局部变量

    可以直接在lambda表达式中访问外层的局部变量。

    7. 访问对象字段与静态变量

    和本地变量不同的是,lambda内部对于实例的字段以及静态变量是即可读又可写。该行为和匿名对象是一致的。

    8. 访问接口的默认方法

    JDK1.8 API包含了很多内建的函数式接口,在老Java中常用到的比如Comparator或者Runnable接口,这些接口都增加了注解以便能用在lambda上。

    Java 8API同样还提供了很多全新的函数式接口来让工作更加方便,有一些接口是来自Google Guava库里的,即便你对这些很熟悉了,还是有必要看看这些是如何扩展到lambda上使用的。

    现在大家对于JDK1.7和JDK1.8的区别应该都清楚了吧,希望大家阅读完这篇文章能有所收获。最后,想要了解更多JDK1.7和JDK1.8的内容,大家可以关注群英网络其它相关文章。

文本转载自PHP中文网

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-08-26 17:47:13 
摘要:php将字符a转化为数字的方法:1、使用boolval()函数,语法“boolval('a')”,可将字符a转为数字1;2、使用ord()函数,语法“ord('a')”,会以整数形式返回字符a的ASCII值,即将字符a转为数字97。
2022-09-15 17:48:15 
摘要:本篇文章给大家带来了关于java的相关知识,其中主要整理了数组的定义和使用的相关问题,包括了main方法中的String数组、数组中存储引用数据类型、数组扩容和拷贝等等内容,下面一起来看一下,希望对大家有帮助。
2022-06-16 09:25:42 
摘要:方法:1、用“$sum=0;”定义一个变量,用于存储计算结果;2、用“foreach($arr as $v){}”循环遍历数组;3、在循环体中,检查数组元素是否为奇数,如果是则相加起来,语法“if($v%2!=0){$sum+=$v;}”。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部