這篇文章主要介紹了jdk1.7和jdk1.8有什么區(qū)別,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
為惠農(nóng)等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及惠農(nóng)網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、成都網(wǎng)站建設(shè)、惠農(nóng)網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!區(qū)別:jdk1.8中取消了永久代,取而代之的是Metaspace,這個(gè)空間不占用jvm虛擬機(jī)的內(nèi)存,而是占用物理機(jī)的內(nèi)存;jdk8新增了lambda表達(dá)式、訪問局部變量、函數(shù)式接口等特性。
jdk1.7與jdk1.8對(duì)比
1. jdk1.7語法上
1) 可以用二進(jìn)制來表示整數(shù),用0b開頭。
2) Switch語句支持string類型
3) try塊可以不用finally手動(dòng)關(guān)閉,直接try塊中就可以關(guān)閉
4) Catch多個(gè)異常 說明:Catch異常類型為final所以不能被修改。這一特性將生成更少的字節(jié)碼并減少代碼冗余。重新拋異常時(shí)保持異常類型。
5) 可在數(shù)字中使用下劃線,更加友好。但要注意下劃線添加規(guī)則,下劃線只能在數(shù)字之間,在數(shù)字的開始或結(jié)束一定不能使用下劃線。
6) 創(chuàng)建泛型實(shí)例時(shí),會(huì)根據(jù)變量聲明時(shí)的泛型類型自動(dòng)推斷出實(shí)例的泛型類型。
7) 在可變參數(shù)方法中傳遞非具體化參數(shù),改進(jìn)編譯警告和錯(cuò)誤。
8) 信息更豐富的回溯追蹤。
2. NIO2的一些新特性
1) 實(shí)現(xiàn)了異步非阻塞IO和Proactor
2) 遞歸查找文件樹,文件擴(kuò)展搜索
3. Jdbc
1) 可以使用try-with-resources自動(dòng)關(guān)閉Connection, ResultSet,和 Statement資源對(duì)象。
2) RowSet1.1(接口模型):引入RowSetFactory接口和RowSetProvider類,可以創(chuàng)建JDBC driver支持的各種 row sets,這里的rowset實(shí)現(xiàn)其實(shí)就是將sql語句上的一些操作轉(zhuǎn)為方法的操作,封裝了一些功能。
3) JDBC-ODBC驅(qū)動(dòng)會(huì)在jdk8中刪除。
4. 并發(fā)工具增強(qiáng)
1) fork-join,F(xiàn)ork/Join框架是Java7提供了的一個(gè)用于并行執(zhí)行任務(wù)的框架, 是一個(gè)把大任務(wù)分割成若干個(gè)小任務(wù),最終匯總每個(gè)小任務(wù)結(jié)果后得到大任務(wù)結(jié)果的框架。(充分利用多核特性,將大問題分解成各個(gè)子問題,由多個(gè)cpu可以同時(shí)解決多個(gè)子問題,最后合并結(jié)果)。
2) ThreadLocalRandon并發(fā)下隨機(jī)數(shù)生成類,保證并發(fā)下的隨機(jī)數(shù)生成的線程安全,實(shí)際上就是使用threadlocal。
3) phaser類
java5有一個(gè)并發(fā)包。里面有semaphore(信號(hào)量)、CountDownLatch(閉鎖)、CyclicBarrier(柵欄)。phaser 類優(yōu)化了CountDownLatch和CyclicBarrier。
信號(hào)量:信號(hào)量就是可以聲明多把鎖(包括一把鎖:此時(shí)為互斥信號(hào)量)。
舉個(gè)例子:一個(gè)房間如果只能容納5個(gè)人,多出來的人必須在門外面等著。如何去做呢?一個(gè)解決辦法就是:房間外面掛著五把鑰匙,每進(jìn)去一個(gè)人就取走一把鑰匙,沒有鑰匙的不能進(jìn)入該房間而是在外面等待。每出來一個(gè)人就把鑰匙放回原處以方便別人再次進(jìn)入。
主要用來控制能夠訪問的較大線程數(shù)。默認(rèn)是非公平的??梢酝ㄟ^構(gòu)造器顯示聲明鎖的公平性。
閉鎖:
含義:CountDownLatch可以理解為一個(gè)計(jì)數(shù)器在初始化時(shí)設(shè)置初始值,當(dāng)一個(gè)線程需要等待某些操作先完成時(shí),需要調(diào)用await()方法。這個(gè)方法讓線程進(jìn)入休眠狀態(tài)直到等待的所有線程都執(zhí)行完成。每調(diào)用一次countDown()方法內(nèi)部計(jì)數(shù)器減1,直到計(jì)數(shù)器為0時(shí)喚醒。這個(gè)可以理解為特殊的CyclicBarrier。線程同步點(diǎn)比較特殊,為內(nèi)部計(jì)數(shù)器值為0時(shí)開始。
方法:核心方法兩個(gè):countDown()和await()。countDown():使CountDownLatch維護(hù)的內(nèi)部計(jì)數(shù)器減1,每個(gè)被等待的線程完成的時(shí)候調(diào)用。
await():線程在執(zhí)行到CountDownLatch的時(shí)候會(huì)將此線程置于休眠
例子:開會(huì)的例子:會(huì)議室里等與會(huì)人員到齊了會(huì)議才能開始。
柵欄:
含義:柵欄允許兩個(gè)或者多個(gè)線程在某個(gè)集合點(diǎn)同步。當(dāng)一個(gè)線程到達(dá)集合點(diǎn)時(shí),它將調(diào)用await()方法等待其它的線程。線程調(diào)用await()方法后,CyclicBarrier將阻塞這個(gè)線程并將它置入休眠狀態(tài)等待其它線程的到來。等最后一個(gè)線程調(diào)用await()方法時(shí),CyclicBarrier將喚醒所有等待的線程然后這些線程將繼續(xù)執(zhí)行。CyclicBarrier可以傳入另一個(gè)Runnable對(duì)象作為初始化參數(shù)。當(dāng)所有的線程都到達(dá)集合點(diǎn)后,CyclicBarrier類將Runnable對(duì)象作為線程執(zhí)行。
方法:await():使線程置入休眠直到最后一個(gè)線程的到來之后喚醒所有休眠的線程。
與CountDownLatch的區(qū)別:
在所有線程到達(dá)集合點(diǎn)后接受一個(gè)Runnable類型的對(duì)象作為后續(xù)的執(zhí)行
沒有顯示調(diào)用CountDown()方法
CountDownLatch一般只能使用一次,CyclicBarrier可以多次使用
應(yīng)用場(chǎng)景:多個(gè)線程做任務(wù),等到達(dá)集合點(diǎn)同步后交給后面的線程做匯總。
Phaser:
含義:更加復(fù)雜和強(qiáng)大的同步輔助類。它允許并發(fā)執(zhí)行多階段任務(wù)。當(dāng)我們有并發(fā)任務(wù)并且需要分解成幾步執(zhí)行時(shí),(CyclicBarrier是分成兩步),就可以選擇使用Phaser。Phaser類機(jī)制是在每一步結(jié)束的位置對(duì)線程進(jìn)行同步,當(dāng)所有的線程都完成了這一步,才允許執(zhí)行下一步。跟其他同步工具一樣,必須對(duì)Phaser類中參與同步操作的任務(wù)數(shù)進(jìn)行初始化,不同的是,可以動(dòng)態(tài)的增加或者減少任務(wù)數(shù)。
函數(shù):arriveAndAwaitAdvance():類似于CyclicBarrier的await()方法,等待其它線程都到來之后同步繼續(xù)執(zhí)行。arriveAndDeregister():把執(zhí)行到此的線程從Phaser中注銷掉。isTerminated():判斷Phaser是否終止。register():將一個(gè)新的參與者注冊(cè)到Phaser中,這個(gè)新的參與者將被當(dāng)成沒有執(zhí)行完本階段的線程。forceTermination():強(qiáng)制Phaser進(jìn)入終止態(tài)
例子:使用Phaser類同步三個(gè)并發(fā)任務(wù)。這三個(gè)任務(wù)將在三個(gè)不同的文件夾及其子文件夾中查找過去24小時(shí)內(nèi)修改過擴(kuò)展為.log的文件。這個(gè)任務(wù)分成以下三個(gè)步驟:查找文件、過濾文件、打印結(jié)果。并且在查找文件和過濾文件結(jié)束后對(duì)結(jié)果進(jìn)行分析,如果是空的,將此線程從Phaser中注銷掉。也就是說,下一階段,該線程將不參與運(yùn)行。在run()方法中,開頭調(diào)用了phaser的arriveAndAwaitAdvance()方法來保證所有線程都啟動(dòng)了之后再開始查找文件。在查找文件和過濾文件階段結(jié)束之后,都對(duì)結(jié)果進(jìn)行了處理。即:如果結(jié)果是空的,那么就把該條線程移除,如果不空,那么等待該階段所有線程都執(zhí)行完該步驟之后在統(tǒng)一執(zhí)行下一步。最后,任務(wù)執(zhí)行完后,把Phaser中的線程均注銷掉。
Phaser其實(shí)有兩個(gè)狀態(tài):活躍態(tài)和終止態(tài)。當(dāng)存在參與同步的線程時(shí),Phaser就是活躍的。并且在每個(gè)階段結(jié)束的時(shí)候同步。當(dāng)所有參與同步的線程都取消注冊(cè)的時(shí)候,Phase就處于終止?fàn)顟B(tài)。在這種狀態(tài)下,Phaser沒有任務(wù)參與者。
Phaser主要功能就是執(zhí)行多階段任務(wù),并保證每個(gè)階段點(diǎn)的線程同步。在每個(gè)階段點(diǎn)還可以條件或者移除參與者。主要涉及方法arriveAndAwaitAdvance()和register()和arriveAndDeregister()。
4) Networking增強(qiáng)
新增URLClassLoader close方法,可以及時(shí)關(guān)閉資源,后續(xù)重新加載class文件時(shí)不會(huì)導(dǎo)致資源被占用或者無法釋放問題。
5) MultithreadedCustom Class Loaders
解決并發(fā)下加載class可能導(dǎo)致的死鎖問題,這個(gè)是jdk1.6的一些新版本就解決了,jdk7也做了一些優(yōu)化。
Java1.8
1. 接口的默認(rèn)方法
Java1.8以前,接口里的方法要求全部是抽象方法,java 8允許我們給接口添加一個(gè)非抽象的方法實(shí)現(xiàn),只需要使用 default關(guān)鍵字即可。
2. lambda表達(dá)式
它將允許我們將行為傳到函數(shù)里。在Java 8之前,如果想將行為傳入函數(shù),僅有的選擇就是匿名類,需要6行代碼。而定義行為最重要的那行代碼,卻混在中間不夠突出。Lambda表達(dá)式取代了匿名類,取消了模板,允許用函數(shù)式風(fēng)格編寫代碼。這樣有時(shí)可讀性更好,表達(dá)更清晰。
3. 函數(shù)式接口
如果一個(gè)接口定義個(gè)一個(gè)抽象方法,那么這個(gè)接口就成為函數(shù)式接口。一個(gè)函數(shù)式接口非常有價(jià)值的屬性就是他們能夠用lambdas來實(shí)例化。
4. 方法與構(gòu)造函數(shù)引用
使用關(guān)鍵字來傳遞方法或者構(gòu)造函數(shù)引用。
5. Lambda作用域
在lambda表達(dá)式中訪問外層作用域和老版本的匿名對(duì)象中的方式很相似。你可以直接訪問標(biāo)記了final的外層局部變量,或者實(shí)例的字段以及靜態(tài)變量。
6. 訪問局部變量
可以直接在lambda表達(dá)式中訪問外層的局部變量。
7. 訪問對(duì)象字段與靜態(tài)變量
和本地變量不同的是,lambda內(nèi)部對(duì)于實(shí)例的字段以及靜態(tài)變量是即可讀又可寫。該行為和匿名對(duì)象是一致的。
8. 訪問接口的默認(rèn)方法
JDK1.8 API包含了很多內(nèi)建的函數(shù)式接口,在老Java中常用到的比如Comparator或者Runnable接口,這些接口都增加了注解以便能用在lambda上。
Java 8API同樣還提供了很多全新的函數(shù)式接口來讓工作更加方便,有一些接口是來自Google Guava庫里的,即便你對(duì)這些很熟悉了,還是有必要看看這些是如何擴(kuò)展到lambda上使用的。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享jdk1.7和jdk1.8有什么區(qū)別內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,詳細(xì)的解決方法等著你來學(xué)習(xí)!