一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java JDK1.5、1.6、1.7新特性整理

Java JDK1.5、1.6、1.7新特性整理

2020-06-23 11:37如蓮家園 JAVA教程

這篇文章主要介紹了Java JDK1.5、1.6、1.7新特性整理,需要的朋友可以參考下

一、Java JDK1.5的新特性

1.泛型:  

?
1
List<String> strs = new ArrayList<String>();//給集合指定存入類型,上面這個集合在存入數據的時候必須存入String類型的數據,否則編譯器會報錯

2.for-each

例如上面這個集合我們可以通過for-each遍歷,這樣更加簡單清晰

?
1
2
3
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
例如:定義代表交通燈的枚舉

?
1
2
3
public enum MyEnum{
  RED,GREEN,YELLOW
}

5.可變參數

什么意思呢?先舉個例子:在JDK1.5以前,當我們要為一個方法傳遞多個類型相同的參數時,我們有兩種方法解決,1.直接傳遞一個數組過去,2.有多少個參數就傳遞多少個參數。
    例如:

?
1
2
3
public void printColor(String red,String green,String yellow){
 
}

    或者

?
1
2
3
public void printColor(String[] colors){
 
}

    這樣編寫方法參數雖然能夠實現我們想要的效果,但是,這樣是不是有點麻煩呢?再者,如果參數個數不確定,我們怎么辦呢?Java JDK1.5為我們提供的可變參數就能夠完美的解決這個問題
    例如:

?
1
2
3
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

關于線程并發庫的內容還有很多(很重要),這里就不一一列舉了,感興趣的朋友可以查看一下幫助文檔。

二、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的新特性更加令我們心動,因為它是我們期待已久的而且看得見摸得著的。

三、JDK1.7的新特性

1.二進制面值

  在java7里,整形(byte,short,int,long)類型的值可以用二進制類型來表示了,在使用二進制的值時,需要在前面加上ob或oB,例如:

?
1
2
3
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也可以了
    例如:

?
1
2
3
4
5
6
7
8
9
10
11
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 接口的對象。
    例如:

?
1
2
3
4
5
6
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.捕獲多種異常并用改進后的類型檢查來重新拋出異常

 例如:

?
1
2
3
4
5
6
7
8
9
10
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 只支持有限的類型推斷:只有構造器的參數化類型在上下文中被顯著的聲明了,你才可以使用類型推斷,否則不行。 

?
1
2
3
4
5
6
7
List<String> list = new ArrayList<>();
list.add("A");
//這個不行
list.addAll(new ArrayList<>());
// 這個可以
List<? extends String> list2 = new ArrayList<>();
list.addAll(list2);


7.(無)

8.新增一些取環境信息的工具方法

例如:

?
1
2
3
4
File System.getUserHomeDir() // 當前用戶目錄
File System.getUserDir() // 啟動java進程時所在的目錄5
File System.getJavaIoTempDir() // IO臨時文件夾
File System.getJavaHomeDir() // JRE的安裝目錄

9.安全的加減乘除

例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
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版本時新的特性不要使用,不然的話就有可能出現這樣或者那樣的問題。

原文鏈接:http://www.cnblogs.com/tony-yang-flutter/p/3503935.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲成人网导航 | 欧美人与物videos另类3d | 国产91精选在线观看麻豆 | 国产在线精品观看 | 四虎永久在线精品国产 | 亚洲 欧美 日韩 综合 | 古装床戏做爰无遮挡三级 | 日韩有码 | 亚洲精品视频网 | 国产日韩欧美一区 | 亚洲国产在线午夜视频无 | 欧美日韩国产一区二区三区在线观看 | 欧美一区二区日韩一区二区 | 羞羞麻豆国产精品1区2区3区 | 天天夜夜草草久久伊人天堂 | 免费的伦理片 | 美女靠逼免费网站 | 8x8拨擦拨擦华人免费 | 国产精品永久免费视频 | 日比免费视频 | 国产成人激情视频 | 日本免费不卡在线一区二区三区 | bestialitysex杂交 bedfriend泰剧全集免费观看 | 国产美女在线一区二区三区 | 俄罗斯三级在线观看级 | 韩国帅男同gay网站 韩国三级在线播放 | 成人在线播放视频 | 国产一级精品高清一级毛片 | 婷婷伊人综合亚洲综合网 | 亚洲国产日韩欧美一区二区三区 | 奇米影视777最新在线 | 精品国产中文字幕在线视频 | 亚洲免费国产 | 免费抽搐一进一出印度 | 天堂bt在线| 18hdxxxx中国| 四虎影院的网址 | 久草在线福利资站免费视频 | 国产成人无精品久久久 | avtt在线播放 | 亚洲社区在线 |