對于很多剛接觸java語言的初學(xué)者來說谈秫,要了解一門語言惕橙,最好的方式就是要能從基礎(chǔ)的版本進(jìn)行了解,升級的過程谓形,以及升級的新特性灶伊,這樣才能循序漸進(jìn)的學(xué)好一門語言。今天先為大家介紹一下JDK1.5版本到JDK1.7版本的特性寒跳。希望能給予幫助聘萨。
JDK1.5新特性:
自動(dòng)裝箱與拆箱:
自動(dòng)裝箱的過程:每當(dāng)需要一種類型的對象時(shí),這種基本類型就自動(dòng)地封裝到與它相同類型的包裝中冯袍。
自動(dòng)拆箱的過程:每當(dāng)需要一個(gè)值時(shí)匈挖,被裝箱對象中的值就被自動(dòng)地提取出來,沒必要再去調(diào)用intValue()和doubleValue()方法康愤。
自動(dòng)裝箱儡循,只需將該值賦給一個(gè)類型包裝器引用,java會(huì)自動(dòng)創(chuàng)建一個(gè)對象征冷。
自動(dòng)拆箱择膝,只需將該對象值賦給一個(gè)基本類型即可。
java——類的包裝器
類型包裝器有:Double,Float,Long,Integer,Short,Character和Boolean枚舉
把集合里的對象元素一個(gè)一個(gè)提取出來检激。枚舉類型使代碼更具可讀性肴捉,理解清晰,易于維護(hù)叔收。枚舉類型是強(qiáng)類型的齿穗,從而保證了系統(tǒng)安全性。而以類的靜態(tài)字段實(shí)現(xiàn)的類似替代模型饺律,不具有枚舉的簡單性和類型安全性窃页。
簡單的用法:JavaEnum簡單的用法一般用于代表一組常用常量,可用來代表一類相同類型的常量值。
復(fù)雜用法:Java為枚舉類型提供了一些內(nèi)置的方法脖卖,同事枚舉常量還可以有自己的方法乒省。可以很方便的遍歷枚舉對象畦木。靜態(tài)導(dǎo)入
通過使用 import static袖扛,就可以不用指定 Constants 類名而直接使用靜態(tài)成員,包括靜態(tài)方法十籍。
import xxxx 和 import static xxxx的區(qū)別是前者一般導(dǎo)入的是類文件如import java.util.Scanner;后者一般是導(dǎo)入靜態(tài)的方法蛆封,import static java.lang.System.out。可變參數(shù)(Varargs)
可變參數(shù)的簡單語法格式為:
methodName([argumentList], dataType...argumentName);內(nèi)使蠢酢(Introspector)
是 Java語言對Bean類屬性娶吞、事件的一種缺省處理方法。例如類A中有屬性name,那我們可以通過getName,setName來得到其值或者設(shè)置新 的值械姻。通過getName/setName來訪問name屬性妒蛇,這就是默認(rèn)的規(guī)則。Java中提供了一套API用來訪問某個(gè)屬性的getter /setter方法楷拳,通過這些API可以使你不需要了解這個(gè)規(guī)則(但你最好還是要搞清楚)绣夺,這些API存放于包java.beans中。
一 般的做法是通過類Introspector來獲取某個(gè)對象的BeanInfo信息欢揖,然后通過BeanInfo來獲取屬性的描述器 (PropertyDescriptor)陶耍,通過這個(gè)屬性描述器就可以獲取某個(gè)屬性對應(yīng)的getter/setter方法,然后我們就可以通過反射機(jī)制來 調(diào)用這些方法她混。泛型(Generic)
C++ 通過模板技術(shù)可以指定集合的元素類型烈钞,而Java在1.5之前一直沒有相對應(yīng)的功能。一個(gè)集合可以放任何類型的對象坤按,相應(yīng)地從集合里面拿對象的時(shí)候我們也 不得不對他們進(jìn)行強(qiáng)制得類型轉(zhuǎn)換毯欣。猛虎引入了泛型,它允許指定集合里元素的類型臭脓,這樣你可以得到強(qiáng)類型在編譯時(shí)刻進(jìn)行類型檢查的好處酗钞。For-Each循環(huán)
For-Each循環(huán)得加入簡化了集合的遍歷。假設(shè)我們要遍歷一個(gè)集合對其中的元素進(jìn)行一些處理来累。
JDK 1.6新特性
Desktop類和SystemTray類
在JDK6中 ,AWT新增加了兩個(gè)類: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è)托盤程序.使用JAXB2來實(shí)現(xiàn)對象與XML之間的映射
JAXB是Java Architecture for XML Binding的縮寫,可以將一個(gè)Java對象轉(zhuǎn)變成為XML格式嘹锁,反之亦然葫录。
我們把對象與關(guān)系數(shù)據(jù)庫之間的映射稱為ORM, 其實(shí)也可以把對象與XML之間的映射稱為OXM(Object XML Mapping). 原來JAXB是Java EE的一部分,在JDK6中领猾,SUN將其放到了Java SE中米同,這也是SUN的一貫做法求冷。JDK6中自帶的這個(gè)JAXB版本是2.0, 比起1.0(JSR 31)來,JAXB2(JSR 222)用JDK5的新特性Annotation來標(biāo)識要作綁定的類和屬性等窍霞,這就極大簡化了開發(fā)的工作量。
實(shí) 際上拯坟,在Java EE 5.0中但金,EJB和Web Services也通過Annotation來簡化開發(fā)工作。另外,JAXB2在底層是用StAX(JSR 173)來處理XML文檔郁季。除了JAXB之外冷溃,我們還可以通過XMLBeans和Castor等來實(shí)現(xiàn)同樣的功能。理解StAX
StAX(JSR 173)是JDK6.0中除了DOM和SAX之外的又一種處理XML文檔的API梦裂。
StAX 的來歷 :在JAXP1.3(JSR 206)有兩種處理XML文檔的方法:DOM(Document Object Model)和SAX(Simple API for XML).
由 于JDK6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都會(huì)用到StAX所以Sun決定把StAX加入到JAXP家族當(dāng)中來似枕,并將JAXP的版本升級到1.4(JAXP1.4是JAXP1.3的維護(hù)版 本). JDK6里面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)重影響性能。使用Compiler API
現(xiàn)在我 們可以用JDK6 的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è)特性對于某些需要用到動(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)編譯,而且是跨平臺的怪蔑。輕量級Http Server API
JDK6 提供了一個(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)方法來處理客戶端請求,在 這里,我們把一個(gè)Http請求和它的響應(yīng)稱為一個(gè)交換,包裝成HttpExchange類,HttpServer負(fù)責(zé)將HttpExchange傳給 HttpHandler實(shí)現(xiàn)類的回調(diào)方法.插入式注解處理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語言的語義映射成為對象, 我們可以在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ì)成為針對Tools或者容器的API. 舉個(gè)例子,我們想建立一套基于Annotation的單元測試框架(如TestNG),在測試類里面用Annotation來標(biāo)識測試期間需要執(zhí)行的測試方法。用Console開發(fā)控制臺程序
JDK6 中提供了java.io.Console 類專用來訪問基于字符的控制臺設(shè)備. 你的程序如果要與Windows下的cmd或者Linux下的Terminal交互,就可以用Console類代勞. 但我們不總是能得到可用的Console, 一個(gè)JVM是否有可用的Console依賴于底層平臺和JVM如何被調(diào)用. 如果JVM是在交互式命令行(比如Windows的cmd)中啟動(dòng)的,并且輸入輸出沒有重定向到另外的地方,那么就可以得到一個(gè)可用的Console實(shí) 例.對腳本語言的支持如: ruby, groovy, javascript.
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ú)定義了自己的Annotations,顯然有點(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 Source ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE 用于標(biāo)注生成的源代碼
Resource Runtime TYPE, METHOD, FIELD 用于標(biāo)注所依賴的資源,容器據(jù)此注入外部資源依賴隧甚,有基于字段的注入和基于setter方法的注入兩種方式
Resources Runtime TYPE 同時(shí)標(biāo)注多個(gè)外部依賴,容器會(huì)把所有這些外部依賴注入
PostConstruct Runtime METHOD 標(biāo)注當(dāng)容器注入所有依賴之后運(yùn)行的方法渡冻,用來進(jìn)行依賴注入后的初始化工作戚扳,只有一個(gè)方法可以標(biāo)注為PostConstruct
PreDestroy Runtime METHOD 當(dāng)對象實(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)安全角色
注意:
a. RolesAllowed,PermitAll,DenyAll不能同時(shí)應(yīng)用到一個(gè)類或方法上
b. 標(biāo)注在方法上的RolesAllowed,PermitAll,DenyAll會(huì)覆蓋標(biāo)注在類上的RolesAllowed,PermitAll,DenyAll
c. RunAs,RolesAllowed,PermitAll,DenyAll和DeclareRoles還沒有加到Java SE 6.0上來
d. 處理以上Annotations的工作是由Java EE容器來做, Java SE 6.0只是包含了上面表格的前五種Annotations的定義類,并沒有包含處理這些Annotations的引擎,這個(gè)工作可以由Pluggable Annotation Processing API(JSR 269)來做
改動(dòng)的地方最大的就是java GUI界面的顯示了,JDK6.0(也就是JDK1.6)支持最新的windows vista系統(tǒng)的Windows Aero視窗效果握础,而JDK1.5不支持7!禀综!
你要在vista環(huán)境下編程的話最好裝jdk6.0简烘,否則它總是換到windows basic視窗效果.