1. Java版本的歷史
Java 的歷史始於 1991 年,當時一群 Sun 程序員決定為小型設備創建一種語言:電視遙控器、咖啡機、烤麵包機、銀行卡等。
這些設備的製造商使用非常不同的處理器來控制他們的產品,因此綁定到特定處理器或操作系統的架構變得非常重要。
Java 的創造者決定將問題分為兩部分:他們的程序不會被編譯成特定處理器的機器代碼,而是被編譯成特殊的中間代碼。反過來,該中間代碼將由稱為虛擬機的特殊程序執行。
大多數程序員將計算機稱為機器。
C++ 被作為 Java 語言的基礎,並被大大簡化和標準化。如果 C++ 允許您以 10 種方式做某事,那麼 Java 只保留其中一種。在某些方面,這就像從象形文字到字母表的過渡。
Java 的第一個版本於 1996 年發布。從那時起,Java 開始了它在世界範圍內的勝利進軍,這反過來又刺激了該語言本身的發展和成長。今天,數百萬個庫和數十億行代碼是用 Java 編寫的,並且每 6 個月發布一次新版本的 Java:
姓名 | 年 | 班級數 |
---|---|---|
JDK 1.0 | 1996年 | 211 |
JDK 1.1 | 1997 | 477 |
J2SE 1.2 | 1998 | 1,524 |
J2SE 1.3 | 2000 | 1,840 |
J2SE 1.4 | 2002年 | 2,723 |
J2SE 5.0 | 2004年 | 3,279 |
Java SE 6 | 2006年 | 3,793 |
Java SE 7 | 2011年 | 4,024 |
Java SE 8 | 2014 | 4,240 |
Java SE 9 | 2017年 | 6,005 |
Java SE 10 | 2018年 | 6,002 |
Java SE 11 | 2018年 | 4,411人 |
Java SE 12 | 2019 | 4,433 |
Java SE 13 | 2019 | 4,515 |
儘管 Java 的版本是定期發布的,但它們對程序員的意義並不相同:Java 的發展時斷時續。
2.Java 2
第一次大飛躍發生在 JDK 1.2 的發佈時。它在那裡有如此多的創新,以至於 Java 的創建者將其重新命名為Java 2 Platform Standard Edition或簡稱為 J2SE 1.2。
主要創新是:
strictfp
關鍵詞- 用於處理圖形的 Swing 庫
- JIT 編譯器,可加速 Java 程序的執行
- 大量的收藏
- 完整的 Unicode 支持:日文、中文和韓文。
今天,這些創新似乎沒有那麼大,但每個大項目都是從小項目發展而來的。如果 20 年前沒有一小群程序員不斷改進這門語言,Java 就不會在今天如此流行。
3.Java 5
JDK 1.5 於 2004 年 9 月發布,它也引入了很多創新,因此不由得換了個新名字:他們決定使用 5.0、6.0 和 7.0,而不是 1.5、1.6 和 1.7 版本。所以,JDK 1.5 的全稱是Java 2 Standard Edition 5.0
此更新包括一些內容,如果沒有這些內容,語言的進一步發展是不可能的。
註釋。從 Spring 和 Hibernate 到 JUnit,半數主要的現代框架都是基於註解構建的。
泛型。泛型將集合(以及更多)的力量提升到了新的高度。代碼變得更簡單、更緊湊、更安全。
自動裝箱/拆箱是原始類型與其包裝類型之間的自動轉換。這使得編寫和閱讀代碼變得更加容易,並使集合更加流行。
循環現在至少佔程序員編寫的所有循環的一半foreach
。而且,當然,在處理集合時它是必不可少的。
枚舉是另一個不錯的新特性。它可以讓很多事情得到精美的簡化。
這些並不是所有的創新:添加了數百個新類。重要的是它們是正確的創新,並且再次有力地推動了 Java 的普及。
4. Java 6
Java 6 因大量小的改進和名稱中數字 2 的放棄而被人們記住:它不再是“Java 2 Standard Edition 6.0”,而只是“Java Standard Edition 6.0”。
以下是一些有趣的創新:
Java編譯器 API使得直接從代碼調用Java 編譯器成為可能。這意味著您的程序現在可以生成表示類代碼的文本,通過調用Java Compiler API的方法對其進行編譯,然後立即開始調用已編譯類的方法。在整個發展領域,這種能力極大地簡化了生活。
在 Java 程序中直接執行JavaScript成為可能。這個特性的出現是因為 JavaSE 6 包含了 Rhino JavaScript 引擎。
5.Java 7
Java 7 於 2011 年 7 月發布,本應有很多改進,但程序員只添加了計劃中的一小部分。特別是,他們添加了以下內容:
用於處理數據輸入和輸出的新庫。稱為New Input Output API,它位於java.nio
包中。
Java 編譯器在編譯時的自動類型推斷讓程序員編寫更少的代碼。編譯器變得更聰明了,而這僅僅是個開始。
switch 語句獲得了使用字符串作為 case 值的能力。
自動資源管理也得到了顯著改善:有了這種try-with-resources
結構,Java 程序可以在不再需要時為您關閉數據流。
還有很多其他的變化,但在我們目前學習Java的階段,它們並不是那麼重要。
6. Java 8
Java 8 於 2014 年 3 月發布,是 Java 最近最強大的更新。
最重要的是,程序員記住它是因為它添加了 lambda 表達式和功能接口(註解@FunctionalInterface
)。我們將在第 21 級檢查它們。您的代碼將不再相同。
還為集合添加了流,結合 lambda 表達式,可以更緊湊地編寫代碼。儘管並不總是更具可讀性。
第三個重大變化是 Java 8 引入了用於處理日期和時間的全新 API — Date Time API。我們將在不久的將來研究它。
7. Java 9
Java 9 於 2017 年 9 月發布。從那時起,Java 的創建者決定更頻繁地發布新版本——每六個月發布一次。他們可能對 Google Chrome 瀏覽器開發人員採用的方法印象深刻。
Java 9 版本更側重於 Java 機器的內部結構。它給普通程序員帶來的最重要的東西是能夠將程序劃分為模塊。當你有數以萬計的類或者你的代碼動態卸載插件時,這是非常方便的。
但在不久的將來,它可能對我們沒什麼用處。
8.Java 11
Java 9 發布六個月後,Java 10 出來了,又過了六個月,Java 11 出來了。
這段時間做了很多小的改進,但你很可能只記得兩個:
它增加了對 Unicode 10 的支持。現在您可以在 Java 程序中使用表情符號。您可以像使用布爾類型一樣使用它們:
改進了類型推斷,並且出現了您一定會喜歡的var
關鍵字。
現在您可以編寫以下內容:
var str = "Hello";
編譯器將其轉換為:
String str = "Hello";
但也有一些損失。Java 的創建者從 JDK 11 中刪除了 JavaFX、Java EE 和 CORBA 等庫。
9.兼容性的重要性
發布新版本時,程序員通常希望從頭開始。畢竟,當他們絕對肯定代碼從一開始就應該如何編寫時,谁愿意修復一堆舊錯誤?
但歷史並不支持這種做法。每當程序員發布程序的新版本時,其 90% 的用戶都在使用舊版本。他們可以使用或忽略該程序的新功能,但用戶討厭的是過去運行良好的功能停止運行。
當程序員發布不兼容的新版本時,許多偉大的產品就死了。或者只是在他們做出重大改變時。例如,在 Windows 8 中放棄“開始”按鈕的想法並沒有吸引用戶。Windows 10 的發布帶回了 Window 8 中刪除的一半內容。
此外,Windows 允許您運行 20 年前為 Windows 95 編寫的程序,甚至 30 年前為 MS DOS 3.0 編寫的程序——它們都可以運行。這是 Windows 仍然流行的原因之一。
如果 Java 的開發人員不關心兼容性,Java 就不會像現在這樣流行。每當有新版本的 Java 機器、新版本的 SDK 或類的重大更改時,自 1996 年 1 月以來編寫的所有 Java 代碼都可以繼續工作。
這通常通過僅添加新方法、類和包而不刪除任何內容來實現。這種方法有其優點和缺點。
一方面,Java 以舊的、次優的和不必要的代碼的形式拖著一堆包袱。另一方面,您用 Java 11 編寫的項目始終可以使用一個用 Java 8 編寫的庫,該庫使用用 Java 5 和 Java 2 編寫的庫。這種大雜燴代碼可以正常工作。
對於 C++ 語言,為 32 位和 64 位平台編譯的庫不能在同一個項目中使用。char
如果你突然發現一個庫中使用的類型使用一個字節,而另一個庫使用兩個字節,你會非常頭疼。
10.棄用
因此,Java 的創建者決定不刪除任何東西,而只是添加新的類和包。但是他們如何讓程序員知道現有的次優解決方案有一個新的有價值的替代方案?
為此,他們想出了註釋@Deprecated
。
如果不贊成使用某些方法或類,則會在其聲明旁邊添加此註釋。這意味著不鼓勵程序員使用代碼。
您仍然可以使用已棄用的類或方法,但不建議這樣做。
人們多久做一次不被推薦的事情?幾乎總是🙂
許多類已被棄用 20 年——它們已經被使用並且仍在使用。人們熟悉它們或者它們只是方便。但是它們有可能在某個時候被移除,所以最好不要使用它們。
所有現代 IDE,包括 IntelliJ IDEA,都可以處理註釋@Deprecated
。已棄用的類和方法的名稱使用刪除線格式顯示。像這樣:
Date date = new Date();
int day = date.getDay();
棄用的類非常流行並且經常在代碼中找到,所以我們很快就會看到其中的一些。
GO TO FULL VERSION