Java JDK1.5、1.6、1.7新特征整頓。本站提示廣大學習愛好者:(Java JDK1.5、1.6、1.7新特征整頓)文章只能為提供參考,不一定能成為您想要的結果。以下是Java JDK1.5、1.6、1.7新特征整頓正文
1、Java JDK1.5的新特征
1.泛型:
List<String> strs = new ArrayList<String>();//給聚集指定存入類型,下面這個聚集在存入數據的時刻必需存入String類型的數據,不然編譯器會報錯
2.for-each
例如下面這個聚集我們可以經由過程for-each遍歷,如許加倍簡略清楚
for(String s : strs){ System.out.println(s); }
留意:應用for-each遍歷聚集時,要遍歷的聚集必需完成了Iterator接口
3.主動拆箱和裝箱功效
甚麼意思呢?
JDK1.5為每個根本數據類型界說了一個封裝類。使java中的根本數據類型也有本身的對象
例如:int -->Integer,
double --> Double,
long --> Long,
char --> Character,
float --> Float,
boolean --> Boolean,
short --> Short,
byte -- > Byte
主動裝包:將根本類型轉換成為對象,例如:int --> Integer
主動拆包:將對象轉換成為根本數據類型,例如:Integer --> int
關於JDK1.5之前聚集總不克不及寄存根本數據類型的成績,如今也可以或許處理。
4.列舉:
列舉是JDK1.5推出的一個比擬中要的特征。其症結字為enum
例如:界說代表交通燈的列舉
public enum MyEnum{ RED,GREEN,YELLOW }
5.可變參數
甚麼意思呢?先舉個例子:在JDK1.5之前,當我們要為一個辦法傳遞多個類型雷同的參數時,我們有兩種辦法處理,1.直接傳遞一個數組曩昔,2.有若干個參數就傳遞若干個參數。
例如:
public void printColor(String red,String green,String yellow){ }
或許
public void printColor(String[] colors){ }
如許編寫辦法參數固然可以或許完成我們想要的後果,然則,如許是否是有點費事呢?再者,假如參數個數不肯定,我們怎樣辦呢?Java JDK1.5為我們供給的可變參數就可以夠完善的處理這個成績
例如:
public void printColor(String... colors){ }
可以如許界說,甚麼意思呢?假如參數的類型雷同,那末可使用“類型+三個點,前面跟一個參數稱號”的情勢。如許的利益就是,只需參數類型雷同,不管傳遞幾個參數都沒無限制
留意:可變參數必需是參數列表的最初一項(該特征對對象和根本數據類型都實用)
6.靜態導入
長處:應用靜態導入可使被導入類的一切靜態變量和靜態辦法在以後類直接可見,應用這些靜態成員無需再給出他們的類名。
缺陷:過度應用會下降代碼的可讀性
7.線程並發庫
線程並發庫是Java1.5提出的關於多線程處置的高等功效,地點包:java.util.concurrent
包含
1.線程互斥
對象類描寫:Lock,RedWriteLock
2.線程通訊
描寫:Condition
3.線程池
ExecutorService
3.同隊伍列
ArrayBlockingQueue
4.同步聚集
ConcurrentHashMap,CopyOnWriteArrayList
5.線程同步對象
Semaphore
關於線程並發庫的內容還有許多(很主要),這裡就紛歧一羅列了,感興致的同伙可以檢查一下贊助文檔。
2、JDK1.6新特征
1.Desktop類和SystemTray類
前者可以用來翻開體系默許閱讀器閱讀指定的URL,翻開體系默許郵件客戶端給指定的郵箱發郵件,用默許運用法式翻開或編纂文件(好比,用記事本翻開以txt為後綴名的文件),用體系默許的打印機打印文檔;後者可以用來在體系托盤區創立一個托盤法式。
2.應用JAXB2來完成對象與XML之間的映照
JAXB是Java Architecture for XML Binding的縮寫,可以將一個Java對象改變成為XML格局,反之亦然。
我們把對象與關系數據庫之間的映照稱為ORM,其實也能夠把對象與XML之間的映照稱為OXM(Object XML Mapping)。本來JAXB是Java EE的一部門,在JDK1.6中,SUN將其放到了Java SE中,這也是SUN的一向做法。JDK1.6中自帶的這個JAXB版本是2.0,比起1.0(JSR 31)來,JAXB2(JSR 222)用JDK5的新特征Annotation來標識要作綁定的類和屬性等,這就極年夜簡化了開辟的任務量。現實上,在Java EE 5.0中,EJB和Web Services也經由過程Annotation來簡化開辟任務。別的,JAXB2在底層是用StAX(JSR 173)來處置XML文檔。
除JAXB以外,我們還可以經由過程XMLBeans和Castor等來完成異樣的功效。
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)都邑用到StAX所以Sun決議把StAX參加到JAXP家族傍邊來,並將JAXP的版本進級到1.4(JAXP1.4是JAXP1.3的保護版本)。JDK1.6外面JAXP的版本就是1.4。StAX是The Streaming API for XML的縮寫,一種應用拉形式解析(pull-parsing)XML文檔的API.StAX經由過程供給一種基於事宜迭代器(Iterator)的API讓法式員去掌握xml文檔解析進程,法式遍歷這個事宜迭代器行止理每個解析事宜,解析事宜可以看作是法式拉出來的,也就是法式促使解析器發生一個解析事宜然後處置該事宜,以後又促使解析器發生下一個解析事宜,如斯輪回直到碰著文檔停止符;SAX也是基於事宜處置xml文檔,但倒是用推形式解析,解析器解析完全個xml文檔後,才發生解析事宜,然後推給法式行止理這些事宜;DOM采取的方法是將全部xml文檔映照到一顆內存樹,如許便可以很輕易地獲得父節點和子結點和兄弟節點的數據,但假如文檔很年夜,將會嚴重影響機能。
4.應用Compiler API
如今我 們可以用JDK1.6 的Compiler API(JSR 199)去靜態編譯Java源文件,Compiler API聯合反射功效便可以完成靜態的發生Java代碼並編譯履行這些代碼,有點靜態說話的特點。
這個特征關於某些須要用到靜態編譯的運用法式相當有效,好比JSP Web Server,當我們手動修正JSP後,是不願望須要重啟Web Server才可以看到後果的,這時候候我們便可以用Compiler API來完成靜態編譯JSP文件,固然,如今的JSP Web Server也是支撐JSP熱安排的,如今的JSP Web Server經由過程在運轉時代經由過程Runtime.exec或ProcessBuilder來挪用javac來編譯代碼,這 種方法須要我們發生另外一個過程去做編譯任務,不敷優雅並且輕易使代碼依附與特定的操作體系;Compiler API經由過程一套易用的尺度的API供給了加倍豐碩的方法去做靜態編譯,並且是跨平 台的。
5.輕量級Http Server API
JDK1.6 供給了一個簡略的Http Server API,據此我們可以構建本身的嵌入式Http Server,它支撐Http和Https協定,供給了HTTP1.1的部門完成,沒有被完成的那部門可以經由過程擴大已有的Http Server API來完成,法式員必需本身完成HttpHandler接口,HttpServer會挪用HttpHandler完成類的回調辦法來處置客戶端要求,在這裡,我們把一個Http要求和它的呼應稱為一個交流,包裝成HttpExchange類,HttpServer擔任將HttpExchange傳給HttpHandler完成類的回調辦法。
6.拔出式注解處置API(Pluggable Annotation Processing API)
拔出式注解處置API(JSR 269)供給一套尺度API來處置Annotations(JSR 175)
現實上JSR 269不只僅用來處置Annotation,我認為更壯大的功效是它樹立了Java 說話自己的一個模子,它把method,package,constructor,type,variable, enum,annotation等Java說話元素映照為Types和Elements(二者有甚麼差別?),從而將Java說話的語義映照成為對象,我們可以在javax.lang.model包上面可以看到這些類。 所以我們可以應用JSR 269供給的API來構建一個功效豐碩的元編程(metaprogramming)情況。JSR 269用Annotation Processor在編譯時代而不是運轉時代處置Annotation,Annotation Processor相當於編譯器的一個插件,所以稱為拔出式注解處置.假如Annotation Processor處置Annotation時(履行process辦法)發生了新的Java代碼,編譯器會再挪用一次Annotation Processor,假如第二次處置還有新代碼發生,就會接著挪用Annotation Processor,直到沒有新代碼發生為止.每履行一次process()辦法被稱為一個"round",如許全部Annotation processing進程可以看做是一個round的序列。
JSR 269重要被設計成為針對Tools或許容器的API. 舉個例子,我們想樹立一套基於Annotation的單位測試框架(如TestNG),在測試類外面用Annotation來標識測試時代須要履行的測試辦法
7.用Console開辟掌握台法式
JDK1.6中供給了java.io.Console 類公用來拜訪基於字符的掌握台裝備。你的法式假如要與Windows下的cmd或許Linux下的Terminal交互,便可以用Console類代庖。但我們不老是能獲得可用的Console,一個JVM能否有可用的Console依附於底層平台和JVM若何被挪用。假如JVM是在交互式敕令行(好比Windows的cmd)中啟動的,而且輸出輸入沒有重定向到別的的處所,那末便可以獲得一個可用的Console實例。
8.對劇本說話的支撐
如: ruby,groovy,javascript。
9.Common Annotations
Common annotations本來是Java EE 5.0(JSR 244)標准的一部門,如今SUN把它的一部門放到了Java SE 6.0中。
跟著Annotation元數據功效(JSR 175)參加到Java SE 5.0外面,許多Java 技巧(好比EJB,Web Services)都邑用Annotation部門取代XML文件來設置裝備擺設運轉參數(或許說是支撐聲明式編程,如EJB的聲明式事務),假如這些技巧為通用目標都零丁界說了本身的otations,明顯有點反復扶植,所以,為其他相干的Java技巧界說一套公共的Annotation是有價值的,可以免反復扶植的同時,也包管Java SE和Java EE 各類技巧的分歧性。
上面羅列出Common Annotations 1.0外面的10個Annotations Common Annotations Annotation Retention Target Description Generated SourceANNOTATION_TYPE,CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE 用於標注生成的源代碼Resource Runtime TYPE,METHOD,FIELD用於標注所依附的資本,容器據此注入內部資本依附,有基於字段的注入和基於setter辦法的注入兩種方法 Resources Runtime TYPE同時標注多個內部依附,容器會把一切這些內部依附注入PostConstructRuntime METHOD標注當容器注入一切依附以後運轉的辦法,用來停止依附注入後的初始化任務,只要一個辦法可以標注為PostConstruct PreDestroy Runtime METHOD當對象實例將要被自在器傍邊刪失落之前,要履行的回調辦法要標注為PreDestroy RunAs Runtime TYPE用於標注用甚麼平安腳色來履行被標注類的辦法,這個平安腳色必需和Container的Security腳色分歧的。RolesAllowed Runtime TYPE,METHOD用於標注許可履行被標注類或辦法的平安腳色,這個平安腳色必需和Container的Security腳色分歧的 PermitAll Runtime TYPE,METHOD許可一切腳色履行被標注的類或辦法DenyAll Runtime TYPE,METHOD不許可任何腳色履行被標注的類或辦法,注解該類或辦法不克不及在Java EE容器外面運轉DeclareRoles Runtime TYPE用來界說可以被運用法式磨練的平安腳色,平日用isUserInRole來磨練平安腳色。
留意:
1.RolesAllowed,PermitAll,DenyAll不克不及同時運用到一個類或辦法上標注在辦法上的RolesAllowed,PermitAll,DenyAll會籠罩標注在類上的 RolesAllowed,PermitAll,DenyAllRunAs,RolesAllowed,PermitAll,DenyAll和DeclareRoles還沒有加到Java SE 6.0下去 處置以上Annotations的任務是由Java EE容器來做,Java SE6.0只是包括了下面表格的前五種Annotations的界說類,並沒有包括處置這些Annotations的引擎,這個任務可以由Pluggable Annotation Processing API(JSR 269)來做。
絕對於1.6的新特征,1.7的新特征加倍令我們心動,由於它是我們等待已久的並且看得見摸得著的。
3、JDK1.7的新特征
1.二進制面值
在java7裡,整形(byte,short,int,long)類型的值可以用二進制類型來表現了,在應用二進制的值時,須要在後面加上ob或oB,例如:
int a =0b01111_00000_11111_00000_10101_01010_10; short b = (short)0b01100_00000_11111_0; byte c = (byte)0B0000_0001;
2.數字變量對下滑線的支撐
JDK1.7可以在數值類型的變量裡添加下滑線。
然則有幾個處所是不克不及添加的
1.數字的開首和開頭
2.小數點前後
3. F或許L前
例如:
int num = 1234_5678_9;
float num2 = 222_33F;
long num3 = 123_000_111L;
3.switch對String的支撐
之前就一向有一個打問號?為何C#可以Java卻不可呢?哈,不外還有JDK1.7今後Java也能夠了
例如:
String status = "orderState"; switch (status) { case "ordercancel": System.out.println("定單撤消"); break; case "orderSuccess": System.out.println("預訂勝利"); break; default: System.out.println("狀況未知"); }
4.try-with-resource
try-with-resources 是一個界說了一個或多個資本的try 聲明,這個資本是指法式處置完它以後須要封閉它的對象。try-with-resources 確保每個資本在處置完成後都邑被封閉。
可使用try-with-resources的資本有:
任何完成了java.lang.AutoCloseable 接口java.io.Closeable 接口的對象。
例如:
public static String readFirstLineFromFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } }
在java 7 和今後的版本裡,BufferedReader完成了java.lang.AutoCloseable接口。
因為BufferedReader界說在try-with-resources 聲明裡,不管try語句正常照樣異常的停止,它都邑主動的關失落。而在java7之前,你須要應用finally塊來關失落這個對象。
5.捕捉多種異常並用改良後的類型檢討來從新拋出異常
例如:
public static void first(){ try { BufferedReader reader = new BufferedReader(new FileReader("")); Connection con = null; Statement stmt = con.createStatement(); } catch (IOException | SQLException e) { //捕捉多個異常,e就是final類型的 e.printStackTrace(); } }
長處:用一個catch處置多個異常,比用多個catch每一個處置一個異常生成的字節碼要更小更高效。
6.創立泛型時類型揣摸
只需編譯器可以從高低文中揣摸出類型參數,你便可以用一對空著的尖括號<>來取代泛型參數。這對括號暗裡被稱為菱形(diamond)。 在Java SE 7之前,你聲明泛型對象時要如許
List<String> list = new ArrayList<String>();
而在Java SE7今後,你可以如許
List<String> list = new ArrayList<>();
由於編譯器可以早年面(List)揣摸出揣摸出類型參數,所今後面的ArrayList以後可以不消寫泛型參數了,只用一對空著的尖括號就行。固然,你必需帶著”菱形”<>,不然會有正告的。
Java SE7 只支撐無限的類型揣摸:只要結構器的參數化類型在高低文中被明顯的聲清楚明了,你才可使用類型揣摸,不然不可。
List<String> list = new ArrayList<>(); list.add("A"); //這個不可 list.addAll(new ArrayList<>()); // 這個可以 List<? extends String> list2 = new ArrayList<>(); list.addAll(list2);
7.(無)
8.新增一些取情況信息的對象辦法
例如:
File System.getUserHomeDir() // 以後用戶目次 File System.getUserDir() // 啟動java過程時地點的目次5 File System.getJavaIoTempDir() // IO暫時文件夾 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)
好吧,到今朝為止就整頓這麼多。今後看到了,我會再添加上去的。
要留意的是:在不肯定你之前的jdk版本時新的特征不要應用,否則的話就有能夠湧現如許或許那樣的成績。