搜索
首页JavaJava基础jdk1.7和jdk1.8的区别是什么

区别:jdk1.8中取消了永久代,取而代之的是Metaspace,这个空间不占用jvm虚拟机的内存,而是占用物理机的内存;jdk8新增了lambda表达式、访问局部变量、函数式接口等特性。

jdk1.7和jdk1.8的区别是什么

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上使用的。

想要查阅更多相关文章,请访问PHP中文网!!

以上是jdk1.7和jdk1.8的区别是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Java中有哪些不同的垃圾收集算法(串行,并行,CMS,G1,ZGC)?Java中有哪些不同的垃圾收集算法(串行,并行,CMS,G1,ZGC)?Mar 14, 2025 pm 05:06 PM

本文讨论了各种Java垃圾收集算法(串行,并行,CMS,G1,ZGC),它们的性能影响和适合大量堆的应用。

什么是Java虚拟机(JVM),它在内部如何工作?什么是Java虚拟机(JVM),它在内部如何工作?Mar 14, 2025 pm 05:05 PM

本文讨论了Java虚拟机(JVM),详细介绍了其在不同平台运行Java程序中的作用。它说明了JVM的内部流程,密钥组件,内存管理,垃圾收集和性能Optimizatio

如何使用Java的Nashorn Engine用JavaScript脚本?如何使用Java的Nashorn Engine用JavaScript脚本?Mar 14, 2025 pm 05:00 PM

Java的Nashorn Engine可以在Java应用程序中启用JavaScript脚本。关键步骤包括设置Nashorn,管理脚本和优化性能。主要问题涉及安全性,内存管理和未来兼容性

如何使用Java的Try-with-Resources语句进行自动资源管理?如何使用Java的Try-with-Resources语句进行自动资源管理?Mar 14, 2025 pm 04:59 PM

Java的Try-with-Resources通过自动关闭文件流或数据库连接等资源来简化资源管理,从而提高代码可读性和可维护性。

如何使用Java的枚举来表示固定的值集?如何使用Java的枚举来表示固定的值集?Mar 14, 2025 pm 04:57 PM

Java枚举代表固定的值集,通过自定义方法和构造函数提供类型安全性,可读性和其他功能。它们增强了代码组织,可用于开关语句中以进行有效的价值处理。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)