本文目錄一覽:
- 1、Java8新特性有哪些?
- 2、java se8的新特性有哪些
- 3、雲南北大青鳥java培訓告訴你java10編程語言都有哪些新特點?
- 4、北大青鳥java培訓:java12相對於java9來說都有哪些新特性?
- 5、Java8這10個特性你知道多少
Java8新特性有哪些?
【注意】本文節選自是 DZone 指南#8194;Java 生態系統的專題文章,作者Trisha Gee是Java資深工程師和佈道者。在本文中,Trisha Gee闡述了Java 8的重要特性以及使用的原因,由OneAPM工程師翻譯。
一、要點速遞
1、在很多情況下,Java8 都能提升應用性能,而無需任何改變或性能調優。
2、 Lambda 表達式、 Streams API 以及現有類的新方法都是提高生產力的重要工具。
3、Java8 新推出的 Optional 類型在處理 null 值時,能減少 NullPointerExceptions 的可能性,給開發者極大的靈活度。
二、其他特性:
速度更快
可以取悅老闆、滿足業務或運營人員的一大賣點是:Java8 運行應用時速度更快。通常,升級至 Java8 的應用都能得到速度上的提升,即便沒有做任何改變或調優。對於為了迎合特定 JVM 而做出調整的應用,這或許並不適用。但 Java8 性能更優的理由還有很多:
80%以上的高端企業級應用都使用JAVA平台(電信、銀行等)。JAVA是成熟的產品,已經有10年的歷史。如果你想在Java行業有所建樹,想要系統的進行java的學習,那麼你可以來這個群,前面是二三一,中間是三一四,後面是零二八。連起來就可以了。 這裡有很多互聯網大牛教你學習,還有免費的課程。不是想學習的就不要加了。
常見數據結構的性能提升:對廣受歡迎的 HashMap 進行的基準測試表明,它們在 Java8 中的性能更好。這種提升非常吸引人——你無需學習新的 Streams API 或 Lambda 語法,甚至不需要改變現有的代碼,就能提升應用的性能。
垃圾回收器提升:通常,Java 應用性能取決於垃圾回收的效率。的確,糟糕的垃圾回收會很大程度上影響應用性能。Java8 對垃圾回收做了很多改變,能有效提升性能並簡化調優。最為人熟知的改變是 PermGen 的移除與 Metaspace 的引入。
Fork/Join 速度提升:fork/join 框架是在 Java7 中首次引入的,目的是簡化使用 JVM 的並發程序。Java8 中投入了很多努力進一步提升該框架。現在,fork/join 在 Streams API 中用於並發操作。
此外,Java8 中還包含諸多改進以支持並發。Oracle 在 JDK 8 中總結了這些性能提升。
代碼行更少
Java 經常被人們詬病其樣本代碼太多。為此,Java8 新的 API 採用了更具功能性的方式,專註於實現什麼而不是如何實現。
Lambda 表達式
Java8 中的 Lambda 表達式不僅是 Java 已有的匿名內部類—— Java8 推出之前傳遞行為的方法之外的語法糖衣。Lambda 表達式採用了 Java 7 的內部改變,因此運用起來相當流暢。想了解如何使用 Lambda 表達式簡化代碼,請繼續閱讀。
集合新方法介紹
Lambda 表達式與 Streams 可能是 Java8 最大的兩個賣點,較少為人知的是 Java 現在允許開發者給現有類添加新的方法,而無需為了向後兼容性折中。這樣,新的方法,結合 Lambda 表達式,能在很大程序上簡化代碼。比如,我們常常需要判斷 Map 中的某個成員是否已經存在,如果不存在則創建之。在 Java8 之前,你可能會這麼做:
private final MapCustomerId, Customer customers = new HashMap();
public void incrementCustomerOrders(CustomerId customerId) {
Customer customer = customers.get(customerId);
if (customer == null) {
customer = new Customer(customerId);
customers.put(customerId, customer);
}
customer.incrementOrders();
}
操作「檢查某個成員在 map 中是否存在,若不存在則添加之」是如此常用,Java 現在為 Map 添加了一個新方法 computeIfAbsent 來支持這個操作。該方法的第二個參數是一個 Lambda 表達式,該表達式定義了如何創建缺少的成員。
public void incrementCustomerOrders(CustomerId customerId) {
Customer customer = customers.computeIfAbsent(customerId,
id – new Customer(id));
customer.incrementOrders();
}
其實,Java8 還有一個新的特性,稱為方法引用(method references),它能使我們用更簡潔的代碼實現該功能:
public void incrementCustomerOrders(CustomerId customerId) {
Customer customer = customers.computeIfAbsent(customerId, Customer::new);
customer.incrementOrders();
}
Java8 為 Map 與 List 都添加了新方法。你可以了解一下這些新方法,看它們能節省多少行代碼。
Streams API
Streams API 為查詢、操縱數據提供了更多靈活度。這是一個很強大的功能。閱讀這些文章能對 Streams API 有更全面的了解。在大數據時代建立流暢的數據查詢會非常有趣,而且也是常用的操作。比如,你有一列書,你希望按照字母表順序排列這些書的作者名,且不含重複。
public ListAuthor getAllAuthorsAlphabetically(ListBook books) {
ListAuthor authors = new ArrayList();
for (Book book : books) {
Author author = book.getAuthor();
if (!authors.contains(author)) {
authors.add(author);
}
}
Collections.sort(authors, new ComparatorAuthor() {
public int compare(Author o1, Author o2) {
return o1.getSurname().compareTo(o2.getSurname());
}
});
return authors;
}
在上面的代碼中,我們首先遍歷這列書,如果書的作者從未在作者列表出現,則添加之。之後,我們根據作者的姓氏按字母表順序對這些作者排序。這種排序操作正是 Streams 擅長解決的領域:
public ListAuthor getAllAuthorsAlphabetically(ListBook books) {
return books.Streams()
.map(book – book.getAuthor())
.distinct()
.sorted((o1, o2) – o1.getSurname().compareTo(o2.getSurname()))
.collect(Collectors.toList());
}
上面的做法不僅代碼行更少,而且描述性更強——後來的開發者讀到這段代碼能夠輕易理解:1、代碼從書中獲取作者姓名。2、只在意從未出現過的作者。3、返回的列表按照作者姓氏排序。將 Streams API 與其他新特性——方法引用(method references)、比較器(Comparator)的新方法結合使用,可以得到更加簡潔的版本:
public ListAuthor getAllAuthorsAlphabetically(ListBook books) {
return books.Streams()
.map(Book::getAuthor)
.distinct()
.sorted(Comparator.comparing(Author::getSurname))
.collect(Collectors.toList());
}
這裡,排序方法按照作者姓氏排序,更加顯而易見了。
便於並行
此前我們淺聊過更利於開箱即用的性能,除了前面提到過的特性,Java8 能更好地利用 CPU 內核。將前例中的 Streams 方法替換為 parallelStreams,JVM 會將此運算分解為不同的任務,使用 fork/join 將這些任務運行在多個核上。然而,並行化並不是加速所有運算的魔法。並行化運算總是會帶來更多工作——分解運算,整合結果,因此無法總是減少時間。但是,對適合併行化的例子,這麼做還是頗有效率的。
最大化減少 Null 指針
Java8 的另一個新特性是全新的 Optional 類型。該類型的含義是「我可能有值,也可能是 null。「這樣一來,API 就可以區分可能為 null 的返回值與絕對不會是 null 的返回值,從而最小化 NullPointerException 異常的發生幾率。
Optional 最贊的用處是處理 null。例如,假設我們要從一個列表中找一本特定的書,新創建的 findFirst() 方法會返回 Optional 類型的值,表明它無法確保是否找到特定的值。有了這個可選擇的值,我們接下來可以決定,如果是 null 值要如何處理。如果想要拋出一個自定義的異常,我們可以使用 orElseThrow:
public Book findBookByTitle(ListBook books, String title) {
OptionalBook foundBook = books.Streams()
.filter(book – book.getTitle().equals(title))
.findFirst();
return foundBook.orElseThrow(() – new BookNotFoundException(“Did not find book with title ” + title));
}
或者,你可以返回其他書:
return foundBook.orElseGet(() – getRecommendedAlternativeBook(title));
或者,返回 Optional 類型,這樣,該方法的調用者可以自己決定書沒找到時要怎麼做。
總結:Java8 作為 Java 語言的一次重大發布,包含語法上的更改、新的方法與數據類型,以及一些能默默提升應用性能的隱性改善。Oracle 已經不再支持 Java 7,因此許多公司都被迫向 Java8 轉移。好消息是,Java8 對業務、現有的應用以及期望提高生產力的開發者都好好多。
java se8的新特性有哪些
java se8新特性如下:
Java Programming Language
1、lambda expressions,一個新的語言特性,它可以將功能作為方法的參數or代碼作為數據,它使你表達單一方法介面的實例更加簡潔。
2、對已經有方法名的方法提供一個更加可讀的lambda expressions為方法的引用。
3、默認方法使新的功能添加到庫的介面,確保與舊版本的介面編寫的代碼的二進位兼容
4、重複註解提供不止一次應用同樣的註解類型
5、類型註解提供應用註解的能力,任何一個類型的使用,不僅在聲明上使用。用於一個可插拔式的系統,此功能提高你代碼的類型檢查。
6、提高類型的推斷
7、方法參數的反射
Collections
1、新的java.util.stream包,提供了stream api支持流元素上的功能性操作。stream api集成到collections api中,使用批量操作,如串列or並行 map-reduce 轉換。
2、使用key collisions改進HashMap的性能
compact profiles
包含java SE平台預定義的子集和使不需要整個平台被部署和運行在小型設備中的應用
security
1、客戶端默認啟用TLS1.2
2、新的AccessController.doPrivileged,用代碼斷言它的privileges的子集,沒有防止全棧遍歷時檢查其他許可權
3、更強的基於密碼的加密演算法
4、SSL/TLS SNI擴展在JSSE伺服器中支持
5、支持AEAD演算法:SunJCE提供增強的支持AES / GCM / nopadding密碼的實現以及GCM演算法參數,SunJSSE提供基於密碼套件的AEAD模式增強
6、keystore增強,包含新的keystore類型java.security.DomainLoadStoreParameter,和新的命令行選項-importpassword
7、SHA-224 Message Digests
8、NSA Suite B加密支持
9、更好的支持High Entropy 隨機數生成
10、新的java.security.cert.PKIXRevocationChecker類為配置撤銷X.509證書
11、win下64-bit PKCS11
12、新的rcache 類型在Kerberos 5 Replay Caching
13、支持Kerberos 5協議轉換和約束代理
14、默認禁用Kerberos 5弱的加密
15、未綁定SASL為GSS-API/Kerberos 5機制
16、多主機名下SASL服務
17、在Mac OS X上JNI橋接到native JGSS
18、在sunjsse提供更強的實力,EDH鍵的支持
19、在JSSE支持伺服器端密碼套件個性設置
JavaFX
1、新Modena theme實現
2、新SwingNode類容許開發者嵌套Swing內容到javaFX應用中
3、新UI Controls 包含DatePicker 和TreeTableView
4、javafx.print包為JavaFX提供公共printing API
5、三維圖形特性,目前包含3D shapes、camera、lights、subscene、material、picking和antialiasing
6、WebView類提供的新功能和改進,支持更多關於HTML5的特性,Web Scokets,Web Workers和Web Fonts
7、增強文本的支持
8、支持Hi-DPI 顯示
9、css樣式類變成公共API
10、新的ScheduledService類允許自動重啟服務
11、ARM平台可用JavaFX
tools
1、jjs命令調用Nashorn引擎
2、java命令允許JavaFX應用
3、java man page已經更新
4、jdeps命令行工具提供分析類文件
5、Java Management Extensions (JMX) 提供遠程診斷命令
6、jarsiger工具可選,從TSA請求籤名時間抽
7、javac tool
7.1、-parameters選項存儲正式的參數名和反射API檢索正式參數的名稱
7.2、JLS 15.21相等操作的類型規則通過javac命令正確的執行
7.3、javac工具現在支持檢查javadoc注釋的內容,該特性通過-Xdoclint選項
7.4、javac工具現在提供生成native header的能力。移除javah工具,通過javac的-h選項使用
8、javadoc tool
8.1、javadoc工具支持新DocTree API
8.2、javadoc工具支持新的javadoc 訪問API,允許在java 應用直接調用javadoc 工具,沒有執行新的進程
8.3、javadoc工具現在支持檢查javadoc注釋的內容,該特性通過-Xdoclint選項
Internationalization
1、unicode增強,支持unicode6.2.0
2、採用unicode CLDR數據和java.locale.providers 系統屬性
3、新的Calendar和Locale APIs
4、安裝一個自定義的資源包作為一個擴展的能力
Deployment
1、對sandbox applet和 java web start app,URLPermission現在是用來允許連接到伺服器從它們啟動完成後。SocketPermission不再授權
2、在所有安全級別,在主要jar文件的jar文件的manifest中必須給定許可權屬性
Date-Time Package
一個新的軟體包,提供更加全面的日期-時間模型
Scripting
Nashorn js 引擎
Pack200
1、Pack200支持常量池條目和由JSR 292引入了新的位元組碼
2、JDK8支持由JSR-292, JSR-308 and JSR-335指定類文件的變化
IO and NIO
1、基於Solaris在Solaris事件埠機制實現新的SelectorProvider。使用系統屬性java.nio.channels.spi.Selector設置的值sun.nio.ch.EventPortSelectorProvder運行
2、減少JDK_HOME/jre/lib/charsets.jar文件中數量
3、提高java.lang.String(byte[], *)構造器和java.lang.String.getBytes()方法的性能
java.lang and java.util.Pack ages
1、並發的數組排序
2、標準的編碼和解碼Base64
3、無符號運算的支持
JDBC
1、移除JDBC-ODBC橋
2、JDBC4.2引入新的功能
Java DB
1、JDK8 包含 Java DB 10.10
Networking
1、添加java.net.URLPermission類
2、在java.net.HttpURLConnection中,如果安裝安全管理,請求要求打開一個連接請求的許可權
Concurrency
1、在java.util.concurrent包中新增類和介面
2、java.util.concurrent.ConcurrentHashMap類添加方法支持聚合操作,基於新的流設施和lambda expressions
3、java.util.concurrent.atomic包中添加類支持可擴展可更新的變數
4、 java.util.concurrent.ForkJoinPool類中添加方法支持通用池
5、 java.util.concurrent.locks.StampedLock類已經添加使用3種模式控制讀/寫訪問的基於能力的鎖
Java XML – JAXP
HotSpot
1、硬體特性增加了AES,UseAES和UseAESIntrinsics標籤在打開基於硬體AES可用(Inter 硬體),硬體必須是2010或更新Westmere硬體,如:打開硬體AES,使用下面標記
-XX:+UseAES -XX:+UseAESIntrinsics
關閉硬體AES:
-XX:-UseAES -XX:-UseAESIntrinsics
2、移除PermGen
3、通過為方法調用引入位元組碼指令支持默認方法
雲南北大青鳥java培訓告訴你java10編程語言都有哪些新特點?
前一段時間我們曾經給大家簡單介紹了關於java10的特性以及發布日期等事情。今天,我們一起來正式了解一下java10編程開發語言的新特性都有哪些,以及針對這些特性的使用方法。
Java10新特性
這次發布的Java10,新帶來的特性並不多。
根據官網公開資料,共有12個JEP(JDKEnhancementProposal特性加強提議),帶來以下加強功能:
JEP286,var局部變數類型推斷。
JEP296,將原來用Mercurial管理的眾多JDK倉庫代碼,合併到一個倉庫中,簡化開發和管理過程。
JEP304,統一的垃圾回收介面。
JEP307,G1垃圾回收器的並行完整垃圾回收,實現並行性來改善壞情況下的延遲。
JEP310,應用程序類數據(AppCDS)共享,通過跨進程共享通用類元數據來減少內存佔用空間,和減少啟動時間。
JEP312,ThreadLocal握手交互。在不進入到全局JVM安全點(Safepoint)的情況下,對線程執行回調。優化可以只停止單個線程,而不是停全部線程或一個都不停。
JEP313,移除JDK中附帶的javah工具。可以使用javac-h代替。
JEP314,使用附加的Unicode語言標記擴展。
JEP317,能將堆內存佔用分配給用戶指定的備用內存設備。
JEP317,使用Graal基於Java的編譯器,可以預先把Java代碼編譯成本地代碼來提升效能。
JEP318,在OpenJDK中提供一組默認的根證書頒發機構證書。開源目前Oracle提供的的JavaSE的根證書,這樣OpenJDK對開發人員使用起來更方便。
JEP322,基於時間定義的發布版本,即上述提到的發布周期。版本號為\$FEATURE.\$INTERIM.\$UPDATE.\$PATCH,分別是大版本,中間版本,升級包和補丁版本。
部分特性說明
1.var類型推斷。
這個語言功能在其他一些語言(C#、JavaScript)和基於JRE的一些語言(Scala和Kotlin)中,早已被加入。
在Java語言很早就在考慮,北大青鳥麗江計算機學院發現早在2016年正式提交了JEP286提議。後來舉行了一次公開的開發工程師調查,獲得多建議的是採用類似Scala的方案,「同時使用val和var」,約佔一半;二多的是「只使用var」,約佔四分之一。後來Oracle公司經過慎重考慮,採用了只使用var關鍵字的方案。
北大青鳥java培訓:java12相對於java9來說都有哪些新特性?
隨著互聯網的不斷發展,軟體編程開發語言也有了多次的更新與升級,而今天電腦培訓就通過案例分析來了解和學習一下,java12都有哪些新特性。
SwitchExpressions或者說起相關的PatternMatching特性,為我們提供了勾勒出了Java語法進化的一個趨勢,將開發者從複雜繁瑣的低層次抽象中逐漸解放出來,以更高層次更優雅的抽象,既降低代碼量,又避免意外編程錯誤的出現,進而提高代碼質量和開發效率。
則是很有現實意義度ShenandoahGC。
它是Redhat主導開發的PauselessGC實現,從大概2013年開始研發,終於取得了重要的階段性成果,與其他PauselessGC類似,ShenandoahGC主要目標是99.9%的暫停小於10ms,暫停與堆大小無關等。
也許了解ShenandoahGC的人比較少,業界聲音比較響亮的是Oracle在JDK11中開源出來的ZGC,或者商業版本的AzulC4(ContinuouslyConcurrentCompactingCollector)。
但是,筆者認為,至少目前,其實際意義大於後兩者,因為:使用ZGC的低門檻是升級到JDK11,對很多團隊來說,這種版本的跳躍並不是非常低成本的事情,更何況是尚不清楚ZGC在自身業務場景中的實際表現如何。
而C4,畢竟是土豪們的選擇,現實情況是,有多少公司連個幾十塊錢的License都不捨得?而ShenandoahGC可是有穩定的JDK8u版本發布的哦,據我所知已經有個別公司在HBase等高實時性產品中實踐許久。
Java8這10個特性你知道多少
下面給你列舉Java8的10個特性:
1、default方法
這是Java語言的一個新特性,現在介面類里可以包含方法體(這就是default方法)了。這些方法會隱式的添加到實現這個介面的每個子類中。
2、終止進程
一旦啟動外部進程的話,當這個進程崩潰,掛起,或者CPU到達100%的時候,你就得回來擦屁股了。Process類現在增加了兩個新的方法,可以來教訓下那些不聽話的進程了。第一個是isAlive()方法,有了它你可以判斷進程是否還活著。第二個方法則更加強大,它叫destroyForcibly(),你可以用它來強制的殺掉一個已經超時或者不再需要的進程。
3、StampedLock
Java 8引入了一個新的讀寫鎖,叫做StampedLock。它不僅更快,同時還提供了一系列強大的API來實現樂觀鎖,這樣如果沒有寫操作在訪問臨界區域的話,你只需很低的開銷就能獲取到一個讀鎖。訪問結束後你可以查詢鎖來判斷這期間是否發生了寫操作,如果有的話再選擇進行重試,升級鎖,或者放棄這個操作。
4、並發計數器
這是多線程程序會用到的另一個小工具。它提供了簡單高效的新介面來實現多線程的並發讀寫計數器的功能,和AtomicInteger比起來,它要更快一些。相當贊的工具。
5、Optional
Java 8借鑒了Scala和Haskell,提供了一個新的Optional模板,可以用它來封裝可能為空的引用。這絕不是終結空指針的銀彈,更多只是使API的設計者可以在代碼層面聲明一個方法可能會返回空值,調用方應該注意這種情況。正因為這個,這隻對新的API有效,前提是調用方不要讓引用逃逸出封裝類,否則的話引用可能會在外面被不安全的廢棄掉。
6、萬物皆可註解
還有一個小的改進就是現在Java註解可以支持任意類型了。之前只有像類和方法聲明之類的才能使用註解。在Java 8裡面,當類型轉化甚至分配新對象的時候,都可以在聲明變數或者參數的時候使用註解。這是Java為了更好地支持靜態分析及檢測工具(比如FireBug)而做的工作中的一部分。這是個很不錯的特性,但是和Java 7的invokeDynamic一樣,它的真正價值取決於社區以後如何去使用它。
7、數值溢出
這些方法早就該出現在Java的核心類庫里了。我有個癖好就是去測試整型超出2^32時溢出的情況,搞出一些噁心的隨機BUG來(怎麼會得到這麼奇怪的一個值?)。
同樣的,這也不是什麼銀彈,只不過是提供了一組函數,這樣你在使用+/*操作符進行數值操作的時候,如果出現了溢出,會拋一個異常。如果我可以決定的話,我會把它作為JVM的默認模式,顯式的標明函數會出現數值溢出。
8、目錄遍歷
遍歷目錄樹這種事通常都得上Google搜下怎麼實現(你很可能用的是Apache.FileUtils)。Java 8給Files類做了一次整容手術,增加了十個新的方法。我最喜歡的一個是walk()方法,它遍歷目錄後會創建出一個惰性的流(文件系統很大的情況下非常有用)。
9、增強的隨機數生成
現在經常都在討論密碼或者密鑰容易遭受攻擊的事。程序的安全性是項很複雜的工程,並且很容易出錯。這就是我為什麼喜歡這個新的SecureRandom.getinstanceStrong()方法的原因,它能自動選擇出當前JVM可用的最佳的隨機數生成器。這樣減少了獲取失敗的機率,同時也避免了默認的弱隨機數生成器可能會導緻密鑰或者加密值容易被黑客攻破的問題。
10、Date.toInstant()
Java 8引入了一個新的日期API。這不難理解,因為現有的這個實在是太難用了。實際上Joda一直以來都是Java日期API的首選。不過儘管有了新的API,但仍有一個嚴重的問題——大量的舊代碼和庫仍然在使用老的API。並且我們還知道這種現狀仍將繼續存在下去。到底該怎麼做呢?
Java 8很優雅的解決了這個問題,它給Date類增加了一個新的方法toInstant(),它可以將Date轉化成新的實現。這樣你馬上就可以切換到新的API,儘管現有的代碼還在使用老的日期API(並且在可預見的未來仍將繼續這樣)。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/251823.html