首頁 > Java > java教程 > 主體

JDK從1.5~1.9版本新功能的系統講解,方便比較

php是最好的语言
發布: 2018-07-30 15:08:17
原創
2561 人瀏覽過

在學習java基礎時,jdk從1.5~1.9版本新特性,我進行了總結,下面也都列舉了它們的用處,而且便於比較,每個版本都各不相同,大家根據需要來進行取捨吧,希望能夠幫助大家。 apache php mysql

jdk1.5的新功能:

1.泛型
   ArrayList list=new ArrayList( )------>ArrayListlist=new ArrayList();
2 自動裝箱/拆箱
   nt i=list.get(0).parseInt(); -------->int i=list.get(0);原始型別與對應的包裝類別不用明確轉換
3 for-each
   i=0;ifor(int i:a){......}
4 static import
   Math.sqrt();---- ----------->sqrt();
5 變長參數
   int sum(int ...intlist)有任一參數,把他看作數組
jdk1.6的新特性:
1.增強的for迴圈語句
Integer[] numbers = computeNumbers();
for (int i=0; i < numbers.length ; i )
sum = numbers[i];
||
int sum = 0;
for ( int number: computeNumbers() )
sum = number ;
2.監視和管理
Java SE 6中對記憶體洩漏增強了分析以及診斷能力。當遇到java.lang.OutOfMemory異常的時候,可以得到一個完整的堆疊訊息,
並且當堆已經滿了的時候,會產生一個Log檔案來記錄這個致命錯誤。另外,JVM還添加了一個選項,讓你在堆滿的時候運行腳本。
3.插入式註解處理
插入式註解處理API(JSR 269)提供一套標準API來處理Annotations
4.安全性
jdk1.7的新特性:
1.模組化特性
Java7也是採用了模組的分割方式來提速,有些不是必須的模組並沒有下載與安裝,當虛擬機器需要的時候,再下載對應的模組,
同時對啟動速度也有了很大的改善。
2.多語言支援
Java7的虛擬機器對多種動態程式語言增加了支持,例如:Rubby、 Python等等。
3.開發者的開發效率得到了改善
switch中可以使用字串
在多執行緒並發與控制方面:輕量級的分離與合併框架,一個支援並發存取的HashMap等等。
透過註解增強程式的靜態檢查。
提供了一些新的API用於檔案系統的存取、非同步的輸入輸出操作、Socket通道的配置與綁定、多點資料包的傳送等等。
4.執行效率的提高
對物件指標由64位元壓縮到與32位元指標相符的技術使得記憶體和記憶體帶區塊的消耗得到了很大的降低因而提高了執行效率。
提供了新的垃圾回收機制(G1)來降低垃圾回收的負載和增強垃圾回收的效果。

JDK1.8的新特性:
1、介面的預設方法
Java 8允許我們為介面新增一個非抽象的方法實現,只需要使用default關鍵字即可,這個特徵又叫做擴充方法。
2、Lambda 表達式
在Java 8 中你就沒必要使用這種傳統的匿名物件的方式了,Java 8提供了更簡潔的語法,lambda表達式:
Collections.sort( names, (String a, String b) -> {
   return b.compareTo(a);
});
3、函數式介面
Lambda表達式是如何在java的類型系統中表示的呢?每一個lambda表達式都對應一個類型,通常是介面類型。而「函數式接口」是指僅僅只包含一個抽象方法的接口,每一個該類型的lambda表達式都會被匹配到這個抽象方法。因為 預設方法 不算抽象方法,所以你也可以為你的函數式介面加入預設方法。
4、方法與建構子參考
Java 8 允許你使用:: 關鍵字來傳遞方法或建構子引用,上面的程式碼展示如何引用一個靜態方法,我們也可以引用一個物件的方法:
converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted);
5、Lambda 作用域
在lambda表達式中存取外層作用域和舊版的匿名物件中的方式很相似。你可以直接存取標記了final的外層局部變量,或是實例的欄位以及靜態變數。
6、存取局部變數
可以直接在lambda表達式中存取外層的局部變數:
7、存取物件欄位與靜態變數
和本機變數不同的是,lambda內部對於實例的欄位以及靜態變數是即可讀取又可寫入。該行為和匿名物件是一致的:
8、存取接口的預設方法
JDK 1.8 API包含了許多內建的函數式接口,在老Java中常用的例如Comparator或Runnable接口,這些接口都增加了@FunctionalInterface註解以便能用在lambda上。
Java 8 API同樣也提供了許多全新的函數式介面來讓工作更加方便,有一些介面是來自Google Guava庫裡的,即便你對這些很熟悉了,還是有必要看看這些是如何擴展到lambda上使用的。

JDK1.9 新功能

java 7 2011發布,Java 8 2014發布,java9發佈於2017年9月21日。你可能已經聽說過 Java 9 的模組系統,但這個新版本還有許多它的更新。這裡有九個令人興奮的新功能將與 Java 9 一起發布。

1. Java 平台級模組系統

Java 9 的定義功能是一套全新的模組系統。當程式碼庫越來越大,創建複雜,盤根錯節的「義大利麵條式程式碼」的幾率呈指數級的增長。這時候就得面對兩個基礎的問題: 很難真正地對程式碼進行封裝, 而係統並沒有對不同部分(也就是 JAR 檔案)之間的依賴關係有個明確的概念。每一個公共類別都可以被類別路徑之下任何其它的公共類別所訪問到, 這樣就會導致無意中使用了並不想被公開訪問的 API。此外,類路徑本身也存在問題: 你怎麼知曉所有需要的 JAR 都已經有了, 或者是不是會有重複的項呢? 模組系統把這倆個問題都給解決了。

模組化的 JAR 檔案都包含一個額外的模組描述器。在這個模組描述器中, 對其它模組的依賴是透過 “requires” 來表示的。另外, “exports” 語句控制著哪些包是可以被其它模組存取到的。所有不被導出的包預設都封裝在模組的裡面。如下是一個模組描述器的範例,存在於「module-info.java」 檔案中:

module
blog {
  
exports
com.pluralsight.blog;
 
  
requires
cms;
}
登入後複製

我們可以如下展示模組:

##請注意,兩個模組都包含封裝的包,因為它們沒有被導出(使用橙色盾牌可視化)。沒有人會偶然地使用來自這些包中的類別。 Java 平臺本身也使用自己的模組系統進行了模組化。透過封裝 JDK 的內部類別,平台更安全,持續改進也更容易。

當啟動一個模組化應用程式時, JVM 會驗證是否所有的模組都能使用,這基於 `requires` 語句-比脆弱的類別路徑邁進了一大步。模組允許你更好地強制結構化封裝你的應用並明確依賴。你可以在這個課程中學習更多關於 Java 9 中模組工作的資訊 。

2. Linking

当你使用具有显式依赖关系的模块和模块化的 JDK 时,新的可能性出现了。你的应用程序模块现在将声明其对其他应用程序模块的依赖以及对其所使用的 JDK 模块的依赖。为什么不使用这些信息创建一个最小的运行时环境,其中只包含运行应用程序所需的那些模块呢? 这可以通过 Java 9 中的新的 jlink 工具实现。你可以创建针对应用程序进行优化的最小运行时映像而不需要使用完全加载 JDK 安装版本。

3. JShell : 交互式 Java REPL

许多语言已经具有交互式编程环境,Java 现在加入了这个俱乐部。您可以从控制台启动 jshell ,并直接启动输入和执行 Java 代码。 jshell 的即时反馈使它成为探索 API 和尝试语言特性的好工具。

测试一个 Java 正则表达式是一个很好的说明 jshell 如何使您的生活更轻松的例子。 交互式 shell 还可以提供良好的教学环境以及提高生产力,您可以在此了解更多信息。在教人们如何编写 Java 的过程中,不再需要解释 “public static void main(String [] args)” 这句废话。

4. 改进的 Javadoc

有时一些小事情可以带来很大的不同。你是否就像我一样在一直使用 Google 来查找正确的 Javadoc 页面呢? 这不再需要了。Javadoc 现在支持在 API 文档中的进行搜索。另外,Javadoc 的输出现在符合兼容 HTML5 标准。此外,你会注意到,每个 Javadoc 页面都包含有关 JDK 模块类或接口来源的信息。

5. 集合工厂方法

通常,您希望在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 “add” 调用,使得代码重复。 Java 9,添加了几种集合工厂方法:

Set<Integer>
ints = Set.of(
1
,
2
,
3
);
List<String>
strings = List.of(
"first"
,
"second"
);
登入後複製

除了更短和更好阅读之外,这些方法也可以避免您选择特定的集合实现。 事实上,从工厂方法返回已放入数个元素的集合实现是高度优化的。这是可能的,因为它们是不可变的:在创建后,继续添加元素到这些集合会导致 “UnsupportedOperationException” 。

6. 改进的 Stream API

长期以来,Stream API 都是 Java 标准库最好的改进之一。通过这套 API 可以在集合上建立用于转换的申明管道。在 Java 9 中它会变得更好。Stream 接口中添加了 4 个新的方法:dropWhile, takeWhile, ofNullable。还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代:

IntStream.iterate(
1
,
i -> i <
100
,
i -> i +
1
).forEach(System.out::println);
登入後複製

第二个参数是一个 Lambda,它会在当前 IntStream 中的元素到达 100 的时候返回 true。因此这个简单的示例是向控制台打印 1 到 99。

除了对 Stream 本身的扩展,Optional 和 Stream 之间的结合也得到了改进。现在可以通过 Optional 的新方法 `stram` 将一个 Optional 对象转换为一个(可能是空的) Stream 对象:

Stream<Integer>
s = Optional.of(
1
).stream();
登入後複製

在组合复杂的 Stream 管道时,将 Optional 转换为 Stream 非常有用。

7. 私有接口方法

Java 8 为我们带来了接口的默认方法。 接口现在也可以包含行为,而不仅仅是方法签名。 但是,如果在接口上有几个默认方法,代码几乎相同,会发生什么情况? 通常,您将重构这些方法,调用一个可复用的私有方法。 但默认方法不能是私有的。 将复用代码创建为一个默认方法不是一个解决方案,因为该辅助方法会成为公共API的一部分。 使用 Java 9,您可以向接口添加私有辅助方法来解决此问题:

public
interface
 
MyInterface
{
 
    
void
normalInterfaceMethod();
 
    
default
void
 
interfaceMethodWithDefault()
{  init(); }
 
    
default
void
 
anotherDefaultMethod()
{ init(); }
 
    
//
This method is not part of the public API exposed by MyInterface
    
private
void
 
init()
{ System.out.println(
"Initializing"
);
}
}
登入後複製

8. HTTP/2

Java 9 中有新的方式来处理 HTTP 调用。这个迟到的特性用于代替老旧的 `HttpURLConnection` API,并提供对 WebSocket 和 HTTP/2 的支持。注意:新的 HttpClient API 在 Java 9 中以所谓的孵化器模块交付。也就是说,这套 API 不能保证 100% 完成。不过你可以在 Java 9 中开始使用这套 API:

HttpClient
client = HttpClient.newHttpClient();
 
HttpRequest
req =
   
HttpRequest.newBuilder(URI.create(
"http://www.google.com"
))
              
.header(
"User-Agent"
,
"Java"
)
              
.GET()
              
.build();
 
 
HttpResponse<String>
resp = client.send(req, HttpResponse.BodyHandler.asString());
登入後複製

HttpResponse resp = client.send(req, HttpResponse.BodyHandler.asString());
除了这个简单的请求/响应模型之外,HttpClient 还提供了新的 API 来处理 HTTP/2 的特性,比如流和服务端推送。

9. 多版本兼容 JAR

我们最后要来着重介绍的这个特性对于库的维护者而言是个特别好的消息。当一个新版本的 Java 出现的时候,你的库用户要花费数年时间才会切换到这个新的版本。这就意味着库得去向后兼容你想要支持的最老的 Java 版本 (许多情况下就是 Java 6 或者 7)。这实际上意味着未来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。幸运的是,多版本兼容 JAR 功能能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本:

multirelease.jar
├──
META-INF
│  
└── versions
│      
└──
9
│          
└── multirelease
│              
└── Helper.
class
├──
multirelease
    
├──
Helper.
class
    
└──
Main.
class
登入後複製

在上述场景中, multirelease.jar 可以在 Java 9 中使用, 不过 Helper 这个类使用的不是顶层的 multirelease.Helper 这个 class, 而是处在“META-INF/versions/9”下面的这个。这是特别为 Java 9 准备的 class 版本,可以运用 Java 9 所提供的特性和库。同时,在早期的 Java 诸版本中使用这个 JAR 也是能运行的,因为较老版本的 Java 只会看到顶层的这个 Helper 类。

end:写的有点长,内容也比较多,可能也掺杂很多废话,希望多多谅解哈,大家多多鼓励,我会持续更新更多优质的文章,分享使我快乐!

相关文章:

JDK 1.5之Generics

相关视频:

极客学院Java8新特性视频教程

以上是JDK從1.5~1.9版本新功能的系統講解,方便比較的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板