Java JDK1.5、1.6、1.7新特性整理
一、Java JDK1.5的新特性
1.泛型:
List<String> strs = new ArrayList<String>();//給集合指定存入類型,上面這個(gè)集合在存入數(shù)據(jù)的時(shí)候必須存入String類型的數(shù)據(jù),否則編譯器會(huì)報(bào)錯(cuò)
2.for-each
例如上面這個(gè)集合我們可以通過for-each遍歷,這樣更加簡單清晰
for(String s : strs){ System.out.println(s); }
注意:使用for-each遍歷集合時(shí),要遍歷的集合必須實(shí)現(xiàn)了Iterator接口
3.自動(dòng)拆箱和裝箱功能
什么意思呢?
JDK1.5為每一個(gè)基本數(shù)據(jù)類型定義了一個(gè)封裝類。使java中的基本數(shù)據(jù)類型也有自己的對(duì)象
例如:int -->Integer,
double --> Double,
long --> Long,
char --> Character,
float --> Float,
boolean --> Boolean,
short --> Short,
byte -- > Byte
自動(dòng)裝包:將基本類型轉(zhuǎn)換成為對(duì)象,例如:int --> Integer
自動(dòng)拆包:將對(duì)象轉(zhuǎn)換成為基本數(shù)據(jù)類型,例如:Integer --> int
對(duì)于JDK1.5之前集合總不能存放基本數(shù)據(jù)類型的問題,現(xiàn)在也能夠解決。
4.枚舉:
枚舉是JDK1.5推出的一個(gè)比較中要的特性。其關(guān)鍵字為enum
例如:定義代表交通燈的枚舉
public enum MyEnum{ RED,GREEN,YELLOW }
5.可變參數(shù)
什么意思呢?先舉個(gè)例子:在JDK1.5以前,當(dāng)我們要為一個(gè)方法傳遞多個(gè)類型相同的參數(shù)時(shí),我們有兩種方法解決,1.直接傳遞一個(gè)數(shù)組過去,2.有多少個(gè)參數(shù)就傳遞多少個(gè)參數(shù)。
例如:
public void printColor(String red,String green,String yellow){ }
或者
public void printColor(String[] colors){ }
這樣編寫方法參數(shù)雖然能夠?qū)崿F(xiàn)我們想要的效果,但是,這樣是不是有點(diǎn)麻煩呢?再者,如果參數(shù)個(gè)數(shù)不確定,我們?cè)趺崔k呢?Java JDK1.5為我們提供的可變參數(shù)就能夠完美的解決這個(gè)問題
例如:
public void printColor(String... colors){ }
可以這樣定義,什么意思呢?如果參數(shù)的類型相同,那么可以使用“類型+三個(gè)點(diǎn),后面跟一個(gè)參數(shù)名稱”的形式。這樣的好處就是,只要參數(shù)類型相同,無論傳遞幾個(gè)參數(shù)都沒有限制
注意:可變參數(shù)必須是參數(shù)列表的最后一項(xiàng)(該特性對(duì)對(duì)象和基本數(shù)據(jù)類型都適用)
6.靜態(tài)導(dǎo)入
優(yōu)點(diǎn):使用靜態(tài)導(dǎo)入可以使被導(dǎo)入類的所有靜態(tài)變量和靜態(tài)方法在當(dāng)前類直接可見,使用這些靜態(tài)成員無需再給出他們的類名。
缺點(diǎn):過度使用會(huì)降低代碼的可讀性
7.線程并發(fā)庫
線程并發(fā)庫是Java1.5提出的關(guān)于多線程處理的高級(jí)功能,所在包:java.util.concurrent
包括
1.線程互斥
工具類描述:Lock,RedWriteLock
2.線程通信
描述:Condition
3.線程池
ExecutorService
3.同步隊(duì)列
ArrayBlockingQueue
4.同步集合
ConcurrentHashMap,CopyOnWriteArrayList
5.線程同步工具
Semaphore
關(guān)于線程并發(fā)庫的內(nèi)容還有很多(很重要),這里就不一一列舉了,感興趣的朋友可以查看一下幫助文檔。
二、JDK1.6新特性
1.Desktop類和SystemTray類
前者可以用來打開系統(tǒng)默認(rèn)瀏覽器瀏覽指定的URL,打開系統(tǒng)默認(rèn)郵件客戶端給指定的郵箱發(fā)郵件,用默認(rèn)應(yīng)用程序打開或編輯文件(比如,用記事本打開以txt為后綴名的文件),用系統(tǒng)默認(rèn)的打印機(jī)打印文檔;后者可以用來在系統(tǒng)托盤區(qū)創(chuàng)建一個(gè)托盤程序。
2.使用JAXB2來實(shí)現(xiàn)對(duì)象與XML之間的映射
JAXB是Java Architecture for XML Binding的縮寫,可以將一個(gè)Java對(duì)象轉(zhuǎn)變成為XML格式,反之亦然。
我們把對(duì)象與關(guān)系數(shù)據(jù)庫之間的映射稱為ORM,其實(shí)也可以把對(duì)象與XML之間的映射稱為OXM(Object XML Mapping)。原來JAXB是Java EE的一部分,在JDK1.6中,SUN將其放到了Java SE中,這也是SUN的一貫做法。JDK1.6中自帶的這個(gè)JAXB版本是2.0,比起1.0(JSR 31)來,JAXB2(JSR 222)用JDK5的新特性Annotation來標(biāo)識(shí)要作綁定的類和屬性等,這就極大簡化了開發(fā)的工作量。實(shí)際上,在Java EE 5.0中,EJB和Web Services也通過Annotation來簡化開發(fā)工作。另外,JAXB2在底層是用StAX(JSR 173)來處理XML文檔。
除了JAXB之外,我們還可以通過XMLBeans和Castor等來實(shí)現(xiàn)同樣的功能。
3.理解StAX
StAX(JSR 173)是JDK1.6.0中除了DOM和SAX之外的又一種處理XML文檔的API。
StAX 的來歷:在JAXP1.3(JSR 206)有兩種處理XML文檔的方法:DOM(Document Object Model)和SAX(Simple API for XML)。
由于JDK1.6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都會(huì)用到StAX所以Sun決定把StAX加入到JAXP家族當(dāng)中來,并將JAXP的版本升級(jí)到1.4(JAXP1.4是JAXP1.3的維護(hù)版本)。JDK1.6里面JAXP的版本就是1.4。StAX是The Streaming API for XML的縮寫,一種利用拉模式解析(pull-parsing)XML文檔的API.StAX通過提供一種基于事件迭代器(Iterator)的API讓程序員去控制xml文檔解析過程,程序遍歷這個(gè)事件迭代器去處理每一個(gè)解析事件,解析事件可以看做是程序拉出來的,也就是程序促使解析器產(chǎn)生一個(gè)解析事件然后處理該事件,之后又促使解析器產(chǎn)生下一個(gè)解析事件,如此循環(huán)直到碰到文檔結(jié)束符;SAX也是基于事件處理xml文檔,但卻是用推模式解析,解析器解析完整個(gè)xml文檔后,才產(chǎn)生解析事件,然后推給程序去處理這些事件;DOM采用的方式是將整個(gè)xml文檔映射到一顆內(nèi)存樹,這樣就可以很容易地得到父節(jié)點(diǎn)和子結(jié)點(diǎn)以及兄弟節(jié)點(diǎn)的數(shù)據(jù),但如果文檔很大,將會(huì)嚴(yán)重影響性能。
4.使用Compiler API
現(xiàn)在我 們可以用JDK1.6 的Compiler API(JSR 199)去動(dòng)態(tài)編譯Java源文件,Compiler API結(jié)合反射功能就可以實(shí)現(xiàn)動(dòng)態(tài)的產(chǎn)生Java代碼并編譯執(zhí)行這些代碼,有點(diǎn)動(dòng)態(tài)語言的特征。
這個(gè)特性對(duì)于某些需要用到動(dòng)態(tài)編譯的應(yīng)用程序相當(dāng)有用,比如JSP Web Server,當(dāng)我們手動(dòng)修改JSP后,是不希望需要重啟Web Server才可以看到效果的,這時(shí)候我們就可以用Compiler API來實(shí)現(xiàn)動(dòng)態(tài)編譯JSP文件,當(dāng)然,現(xiàn)在的JSP Web Server也是支持JSP熱部署的,現(xiàn)在的JSP Web Server通過在運(yùn)行期間通過Runtime.exec或ProcessBuilder來調(diào)用javac來編譯代碼,這 種方式需要我們產(chǎn)生另一個(gè)進(jìn)程去做編譯工作,不夠優(yōu)雅而且容易使代碼依賴與特定的操作系統(tǒng);Compiler API通過一套易用的標(biāo)準(zhǔn)的API提供了更加豐富的方式去做動(dòng)態(tài)編譯,而且是跨平 臺(tái)的。
5.輕量級(jí)Http Server API
JDK1.6 提供了一個(gè)簡單的Http Server API,據(jù)此我們可以構(gòu)建自己的嵌入式Http Server,它支持Http和Https協(xié)議,提供了HTTP1.1的部分實(shí)現(xiàn),沒有被實(shí)現(xiàn)的那部分可以通過擴(kuò)展已有的Http Server API來實(shí)現(xiàn),程序員必須自己實(shí)現(xiàn)HttpHandler接口,HttpServer會(huì)調(diào)用HttpHandler實(shí)現(xiàn)類的回調(diào)方法來處理客戶端請(qǐng)求,在這里,我們把一個(gè)Http請(qǐng)求和它的響應(yīng)稱為一個(gè)交換,包裝成HttpExchange類,HttpServer負(fù)責(zé)將HttpExchange傳給HttpHandler實(shí)現(xiàn)類的回調(diào)方法。
6.插入式注解處理API(Pluggable Annotation Processing API)
插入式注解處理API(JSR 269)提供一套標(biāo)準(zhǔn)API來處理Annotations(JSR 175)
實(shí)際上JSR 269不僅僅用來處理Annotation,我覺得更強(qiáng)大的功能是它建立了Java 語言本身的一個(gè)模型,它把method,package,constructor,type,variable, enum,annotation等Java語言元素映射為Types和Elements(兩者有什么區(qū)別?),從而將Java語言的語義映射成為對(duì)象,我們可以在javax.lang.model包下面可以看到這些類。 所以我們可以利用JSR 269提供的API來構(gòu)建一個(gè)功能豐富的元編程(metaprogramming)環(huán)境。JSR 269用Annotation Processor在編譯期間而不是運(yùn)行期間處理Annotation,Annotation Processor相當(dāng)于編譯器的一個(gè)插件,所以稱為插入式注解處理.如果Annotation Processor處理Annotation時(shí)(執(zhí)行process方法)產(chǎn)生了新的Java代碼,編譯器會(huì)再調(diào)用一次Annotation Processor,如果第二次處理還有新代碼產(chǎn)生,就會(huì)接著調(diào)用Annotation Processor,直到?jīng)]有新代碼產(chǎn)生為止.每執(zhí)行一次process()方法被稱為一個(gè)"round",這樣整個(gè)Annotation processing過程可以看作是一個(gè)round的序列。
JSR 269主要被設(shè)計(jì)成為針對(duì)Tools或者容器的API. 舉個(gè)例子,我們想建立一套基于Annotation的單元測(cè)試框架(如TestNG),在測(cè)試類里面用Annotation來標(biāo)識(shí)測(cè)試期間需要執(zhí)行的測(cè)試方法
7.用Console開發(fā)控制臺(tái)程序
JDK1.6中提供了java.io.Console 類專用來訪問基于字符的控制臺(tái)設(shè)備。你的程序如果要與Windows下的cmd或者Linux下的Terminal交互,就可以用Console類代勞。但我們不總是能得到可用的Console,一個(gè)JVM是否有可用的Console依賴于底層平臺(tái)和JVM如何被調(diào)用。如果JVM是在交互式命令行(比如Windows的cmd)中啟動(dòng)的,并且輸入輸出沒有重定向到另外的地方,那么就可以得到一個(gè)可用的Console實(shí)例。
8.對(duì)腳本語言的支持
如: ruby,groovy,javascript。
9.Common Annotations
Common annotations原本是Java EE 5.0(JSR 244)規(guī)范的一部分,現(xiàn)在SUN把它的一部分放到了Java SE 6.0中。
隨著Annotation元數(shù)據(jù)功能(JSR 175)加入到Java SE 5.0里面,很多Java 技術(shù)(比如EJB,Web Services)都會(huì)用Annotation部分代替XML文件來配置運(yùn)行參數(shù)(或者說是支持聲明式編程,如EJB的聲明式事務(wù)),如果這些技術(shù)為通用目的都單獨(dú)定義了自己的otations,顯然有點(diǎn)重復(fù)建設(shè),所以,為其他相關(guān)的Java技術(shù)定義一套公共的Annotation是有價(jià)值的,可以避免重復(fù)建設(shè)的同時(shí),也保證Java SE和Java EE 各種技術(shù)的一致性。
下面列舉出Common Annotations 1.0里面的10個(gè)Annotations Common Annotations Annotation Retention Target Description Generated SourceANNOTATION_TYPE,CONSTRUCTOR,F(xiàn)IELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE 用于標(biāo)注生成的源代碼Resource Runtime TYPE,METHOD,F(xiàn)IELD用于標(biāo)注所依賴的資源,容器據(jù)此注入外部資源依賴,有基于字段的注入和基于setter方法的注入兩種方式 Resources Runtime TYPE同時(shí)標(biāo)注多個(gè)外部依賴,容器會(huì)把所有這些外部依賴注入PostConstructRuntime METHOD標(biāo)注當(dāng)容器注入所有依賴之后運(yùn)行的方法,用來進(jìn)行依賴注入后的初始化工作,只有一個(gè)方法可以標(biāo)注為PostConstruct PreDestroy Runtime METHOD當(dāng)對(duì)象實(shí)例將要被從容器當(dāng)中刪掉之前,要執(zhí)行的回調(diào)方法要標(biāo)注為PreDestroy RunAs Runtime TYPE用于標(biāo)注用什么安全角色來執(zhí)行被標(biāo)注類的方法,這個(gè)安全角色必須和Container的Security角色一致的。RolesAllowed Runtime TYPE,METHOD用于標(biāo)注允許執(zhí)行被標(biāo)注類或方法的安全角色,這個(gè)安全角色必須和Container的Security角色一致的 PermitAll Runtime TYPE,METHOD允許所有角色執(zhí)行被標(biāo)注的類或方法DenyAll Runtime TYPE,METHOD不允許任何角色執(zhí)行被標(biāo)注的類或方法,表明該類或方法不能在Java EE容器里面運(yùn)行DeclareRoles Runtime TYPE用來定義可以被應(yīng)用程序檢驗(yàn)的安全角色,通常用isUserInRole來檢驗(yàn)安全角色。
注意:
1.RolesAllowed,PermitAll,DenyAll不能同時(shí)應(yīng)用到一個(gè)類或方法上標(biāo)注在方法上的RolesAllowed,PermitAll,DenyAll會(huì)覆蓋標(biāo)注在類上的 RolesAllowed,PermitAll,DenyAllRunAs,RolesAllowed,PermitAll,DenyAll和DeclareRoles還沒有加到Java SE 6.0上來 處理以上Annotations的工作是由Java EE容器來做,Java SE6.0只是包含了上面表格的前五種Annotations的定義類,并沒有包含處理這些Annotations的引擎,這個(gè)工作可以由Pluggable Annotation Processing API(JSR 269)來做。
相對(duì)于1.6的新特性,1.7的新特性更加令我們心動(dòng),因?yàn)樗俏覀兤诖丫玫亩铱吹靡娒弥摹?/p>
三、JDK1.7的新特性
1.二進(jìn)制面值
在java7里,整形(byte,short,int,long)類型的值可以用二進(jìn)制類型來表示了,在使用二進(jìn)制的值時(shí),需要在前面加上ob或oB,例如:
int a =0b01111_00000_11111_00000_10101_01010_10; short b = (short)0b01100_00000_11111_0; byte c = (byte)0B0000_0001;
2.數(shù)字變量對(duì)下滑線的支持
JDK1.7可以在數(shù)值類型的變量里添加下滑線。
但是有幾個(gè)地方是不能添加的
1.數(shù)字的開頭和結(jié)尾
2.小數(shù)點(diǎn)前后
3. F或者L前
例如:
int num = 1234_5678_9;
float num2 = 222_33F;
long num3 = 123_000_111L;
3.switch對(duì)String的支持
之前就一直有一個(gè)打問號(hào)?為什么C#可以Java卻不行呢?哈,不過還有JDK1.7以后Java也可以了
例如:
String status = "orderState"; switch (status) { case "ordercancel": System.out.println("訂單取消"); break; case "orderSuccess": System.out.println("預(yù)訂成功"); break; default: System.out.println("狀態(tài)未知"); }
4.try-with-resource
try-with-resources 是一個(gè)定義了一個(gè)或多個(gè)資源的try 聲明,這個(gè)資源是指程序處理完它之后需要關(guān)閉它的對(duì)象。try-with-resources 確保每一個(gè)資源在處理完成后都會(huì)被關(guān)閉。
可以使用try-with-resources的資源有:
任何實(shí)現(xiàn)了java.lang.AutoCloseable 接口java.io.Closeable 接口的對(duì)象。
例如:
public static String readFirstLineFromFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } }
在java 7 以及以后的版本里,BufferedReader實(shí)現(xiàn)了java.lang.AutoCloseable接口。
由于BufferedReader定義在try-with-resources 聲明里,無論try語句正常還是異常的結(jié)束,它都會(huì)自動(dòng)的關(guān)掉。而在java7以前,你需要使用finally塊來關(guān)掉這個(gè)對(duì)象。
5.捕獲多種異常并用改進(jìn)后的類型檢查來重新拋出異常
例如:
public static void first(){ try { BufferedReader reader = new BufferedReader(new FileReader("")); Connection con = null; Statement stmt = con.createStatement(); } catch (IOException | SQLException e) { //捕獲多個(gè)異常,e就是final類型的 e.printStackTrace(); } }
優(yōu)點(diǎn):用一個(gè)catch處理多個(gè)異常,比用多個(gè)catch每個(gè)處理一個(gè)異常生成的字節(jié)碼要更小更高效。
6.創(chuàng)建泛型時(shí)類型推斷
只要編譯器可以從上下文中推斷出類型參數(shù),你就可以用一對(duì)空著的尖括號(hào)<>來代替泛型參數(shù)。這對(duì)括號(hào)私下被稱為菱形(diamond)。 在Java SE 7之前,你聲明泛型對(duì)象時(shí)要這樣
List<String> list = new ArrayList<String>();
而在Java SE7以后,你可以這樣
List<String> list = new ArrayList<>();
因?yàn)榫幾g器可以從前面(List)推斷出推斷出類型參數(shù),所以后面的ArrayList之后可以不用寫泛型參數(shù)了,只用一對(duì)空著的尖括號(hào)就行。當(dāng)然,你必須帶著”菱形”<>,否則會(huì)有警告的。
Java SE7 只支持有限的類型推斷:只有構(gòu)造器的參數(shù)化類型在上下文中被顯著的聲明了,你才可以使用類型推斷,否則不行。
List<String> list = new ArrayList<>(); list.add("A"); //這個(gè)不行 list.addAll(new ArrayList<>()); // 這個(gè)可以 List<? extends String> list2 = new ArrayList<>(); list.addAll(list2);
7.(無)
8.新增一些取環(huán)境信息的工具方法
例如:
File System.getUserHomeDir() // 當(dāng)前用戶目錄 File System.getUserDir() // 啟動(dòng)java進(jìn)程時(shí)所在的目錄5 File System.getJavaIoTempDir() // IO臨時(shí)文件夾 File System.getJavaHomeDir() // JRE的安裝目錄
9.安全的加減乘除
例如:
int Math.safeToInt(long value) int Math.safeNegate(int value) long Math.safeSubtract(long value1, int value2) long Math.safeSubtract(long value1, long value2) int Math.safeMultiply(int value1, int value2) long Math.safeMultiply(long value1, int value2) long Math.safeMultiply(long value1, long value2) long Math.safeNegate(long value) int Math.safeAdd(int value1, int value2) long Math.safeAdd(long value1, int value2) long Math.safeAdd(long value1, long value2) int Math.safeSubtract(int value1, int value2)
好吧,到目前為止就整理這么多。以后看到了,我會(huì)再添加上去的。
要注意的是:在不確定你之前的jdk版本時(shí)新的特性不要使用,不然的話就有可能出現(xiàn)這樣或者那樣的問題。
- JDK13.0.1安裝與環(huán)境變量的配置教程圖文詳解(Win10平臺(tái)為例)
- windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝教程
- win10 java(jdk安裝)環(huán)境變量配置和相關(guān)問題
- Windows10系統(tǒng)下JDK1.8的下載安裝及環(huán)境變量配置的教程
- JDK8新特性之判空遍歷寫法
- 深入淺析JDK8新特性之Lambda表達(dá)式
- JDK 7 新特性小結(jié)實(shí)例代碼解析
- JDK 14的新特性:文本塊Text Blocks的使用
- JDK14的新特性NullPointerExceptions的使用
- JDK10新特性之本地變量類型var的深入理解
相關(guān)文章
五分鐘教你手寫 SpringBoot 本地事務(wù)管理實(shí)現(xiàn)
這篇文章主要介紹了五分鐘教你手寫 SpringBoot 本地事務(wù)管理實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Java中jqGrid 學(xué)習(xí)筆記整理——進(jìn)階篇(二)
這篇文章主要介紹了Java中jqGrid 學(xué)習(xí)筆記整理——進(jìn)階篇(二)的相關(guān)資料,需要的朋友可以參考下2016-04-04java實(shí)現(xiàn)往hive 的map類型字段寫數(shù)據(jù)
這篇文章主要介紹了java實(shí)現(xiàn)往hive 的map類型字段寫數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Mybatis-Plus或PageHelper多表分頁查詢總條數(shù)不對(duì)問題的解決方法
PageHelper 這個(gè)插件用了很多次了,今天使用的時(shí)候才遇到一個(gè)問題,這篇文章主要給大家介紹了關(guān)于Mybatis-Plus或PageHelper多表分頁查詢總條數(shù)不對(duì)問題的解決方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08項(xiàng)目總結(jié)之HttpURLConnection的disconnect的問題
這篇文章主要介紹了項(xiàng)目總結(jié)之HttpURLConnection的disconnect的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06springboot2.x整合redis知識(shí)點(diǎn)講解
在本篇文章中小編給大家分享的是一篇關(guān)于springboot2.x整合redis知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-01-01