中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

jdk1.7和jdk1.8有什么區別

發布時間:2020-12-15 09:45:27 來源:億速云 閱讀:1910 作者:小新 欄目:編程語言

這篇文章主要介紹了jdk1.7和jdk1.8有什么區別,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

區別:jdk1.8中取消了永久代,取而代之的是Metaspace,這個空間不占用jvm虛擬機的內存,而是占用物理機的內存;jdk8新增了lambda表達式、訪問局部變量、函數式接口等特性。

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個人,多出來的人必須在門外面等著。如何去做呢?一個解決辦法就是:房間外面掛著五把鑰匙,每進去一個人就取走一把鑰匙,沒有鑰匙的不能進入該房間而是在外面等待。每出來一個人就把鑰匙放回原處以方便別人再次進入。

jdk1.7和jdk1.8有什么區別

主要用來控制能夠訪問的最大線程數。默認是非公平的。可以通過構造器顯示聲明鎖的公平性。

閉鎖:

含義: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有什么區別內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金阳县| 鄢陵县| 年辖:市辖区| 东海县| 遂平县| 昌邑市| 波密县| 岳阳县| 望奎县| 靖州| 鲁山县| 会昌县| 宜兰市| 德昌县| 柳林县| 南召县| 江华| 灵石县| 灵宝市| 景泰县| 金湖县| 九江市| 株洲市| 兴业县| 芦山县| 阿拉尔市| 灵寿县| 高平市| 化隆| 新巴尔虎右旗| 修武县| 永春县| 古田县| 交城县| 尼玛县| 南江县| 明水县| 阿克苏市| 咸宁市| 化德县| 潼南县|