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