JDK5-JDK8的區別

jdk5新特性
一、自動裝箱和拆箱
二、枚舉
三、靜態導入
四、可變參數
五、內省
   是Java語言對Bean類屬性、事件的一種缺省處理方法。例如類A中有屬性那麼,那咱們能夠經過getName,setName來獲得其值或者設置新的值。經過getName/setName來訪問name屬性,這就是默認的規則。Java中提供了一套API用來訪問某個屬性的getter,setter方法,經過這些API可使你不須要了解這個規則,這些API存放於包java.beans中。
   通常的作法是經過類Introspector來獲取某個對象的BeanInfo信息,而後經過BeanInfo來獲取屬性的描述器(PropertyDescriptor),經過這個屬性描述器就能夠獲取某個屬性對應的getter/setter方法,而後咱們就能夠經過反射機制來調用這些方法。
六、泛型
七、For-Each循環


jdk6新特性
一、Desktop類和SystemTray類
   AWT新增長了兩個雷:Desktop,SystemTray。
   Desktop能夠用來打開系統默認瀏覽器指定的URL,打開系統默認郵件客戶端給指定的郵件帳號發郵件,用默認應用程序打開或編輯文件(好比,用記事本打開txt文件),用系統默認的打印機打印文檔
   SystemTray能夠用來在系統托盤區建立一個托盤程序
二、使用JAXB2來實現對象與XML之間的映射
   也就是對象與XML之間的映射(OXM),也能夠經過XMLBeans和Castor等來實現一樣的功能。
三、StAX
   StAX是The Streaming API for XML的縮寫,一種利用拉模式解析(pull-parsing)XML文檔的API.StAX經過提供一種基於事件迭代器(Iterator)的API讓 程序員去控制xml文檔解析過程,程序遍歷這個事件迭代器去處理每個解析事件,解析事件能夠看作是程序拉出來的,也就是程序促使解析器產生一個解析事件 而後處理該事件,以後又促使解析器產生下一個解析事件,如此循環直到碰到文檔結束符; 
            SAX也是基於事件處理xml文檔,但卻 是用推模式解析,解析器解析完整個xml文檔後,才產生解析事件,而後推給程序去處理這些事件;DOM 採用的方式是將整個xml文檔映射到一顆內存樹,這樣就能夠很容易地獲得父節點和子結點以及兄弟節點的數據,但若是文檔很大,將會嚴重影響性能。
四、使用Compiler API
            使用JDK6的Compiler API去動態的編譯Java源文件,Compiler API結合反射功能就能夠實現動態的產生Java代碼並編譯執行這些代碼。
五、輕量級Http Server API
六、插入式註解處理API
七、用Console開發控制檯程序
八、對腳本語言的支持如:ruby,groovy,javascript
九、Common Annotations


jdk7新特性
一、switch中可使用字符串
二、泛型的自動判斷
三、自定義自動關閉類(實現AutoCloseable接口)
四、新增一些取環境信息的工具方法(System中的方法)
五、Boolean類型反轉,空指針安全,參數與位運算
六、兩個char間的equals
七、安全的加減乘除


一、對Java集合(Collections)的加強支持
   List<String> list=["item"]; //向List集合中添加元素
   String item=list[0]; //從List集合中獲取元素
   Set<String> set={"item"}; //向Set集合對象中添加元
   Map<String,Integer> map={"key":1}; //向Map集合中添加對象
   int value=map["key"]; //從Map集合中獲取對象
   可是通過本身測試,按照上面的使用方法,並不能建立集合。
二、int支持二進制數據
三、在try catch異常捕捉中,一個catch能夠寫多個異常類型
Connection conn = null;
try {
    Class.forName("com.mysql.jdbc.Driver");
    conn = DriverManager.getConnection("","","");
} catch(ClassNotFoundException|SQLException ex) {
    ex.printStackTrace();
}
四、try catch中資源定義好以後try catch自動關閉
try (BufferedReader in  = new BufferedReader(new FileReader("in.txt"));
     BufferedWriter out = new BufferedWriter(new FileWriter("out.txt"))) {
int charRead;
while ((charRead = in.read()) != -1) {
        System.out.printf("%c ", (char)charRead);
        out.write(charRead);
    }
} catch (IOException ex) {
    ex.printStackTrace();
}
jdk8新特性
一、接口的默認方法
Java 8容許咱們給接口添加一個非抽象的方法實現,只須要使用default關鍵字便可,這個特徵又叫作擴展方法,示例以下:
public interface Formula {
    double calculate(int a);
    default double sqrt(int a) {
return Math.sqrt(a);
    }
}
Formula接口在擁有calculate方法以外同時還定義了sqrt方法,實現了Formula接口的子類只須要實現一個calculate方法,默認方法sqrt將在子類上能夠直接使用。
    Formula formula = new Formula() {
@Override
public double calculate(int a) {
return sqrt(a * 100);
        }
    };
    System.out.println(formula.calculate(100));  // 100.0
    System.out.println(formula.sqrt(16));  // 4.0
文中的formula被實現爲一個匿名類的實例,該代碼很是
二、Lambda表達式
List<String> names = Arrays.asList("tom","jace","mike");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
    }
});
只須要給靜態方法Collections.sort傳入一個List對象以及一個比較器來指定順序排列。一般作法都是建立一個匿名的比較器對象,而後將其傳遞給sort方法。
在Java 8中提供了更簡潔的語法,lambda表達式:
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
還能夠更簡潔:
Collections.sort(names, (String a, String b) -> b.compareTo(a));
去掉大括號以及return關鍵字
Collections.sort(names, (a,b) -> b.compareTo(a));
Java編譯器能夠自動推導出參數類型,因此能夠不用再寫一次類型。
三、函數式接口
Lambda表達式是如何在java的類型系統中表示的呢?
每個lambda表達式都對應着一個類型,一般是接口類型。而「函數式接口」是指僅僅只包含一個抽象方法的接口,每個該類型的lambda表達式都會被匹配到這個抽象方法。由於默認方法不算抽象方法,因此也能夠給本身的函數式接口添加默認方法。
咱們能夠將lambda表達式當作一個抽象方法的接口類型,確保本身的接口必定達到這個要求,你只須要給你的接口添加@FunctionalInterface註解,編譯器若是發現標註了這個註解的接口有多於一個抽象方法的時候就會報錯。也就是說@ FunctionalInterface註解標註的接口只能有一個抽象方法。
例如:
@FunctionalInterface
public interface Converter<F, T> {
T convert(F from);
}
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted);
以上代碼不須要@FunctionalInterface註解也是正確的。
四、方法與構造函數引用
上面的代碼也能夠經過靜態方法引用來表示:
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);
Java8容許使用::關鍵字來傳遞方法或者構造函數引用,上面的代碼展現瞭如何引用一個靜態方法,咱們也能夠引用一個對象的方法:
public class Person {
    String firstName;
    String lastName;
    Person() {
    }
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
    }
}
指定一個用來建立Person對象的對象工廠接口:
public interface PersonFactory<P extends Person> {
P create(String fisrtName, String lastName);
}
建立Person對象
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter","Parker」);
咱們只須要使用Person::new 來獲取Person類構造函數的引用,Java編譯器就會自動根據PersonFactory.create方法的簽名來選擇合適的構造函數。
五、Lambda做用域
在lambda表達式中訪問外層做用域和老版本的匿名對象中的方式很類似。你能夠直接訪問標記了final的外層局部變量,或者實例的字段以及靜態變量。
六、訪問局部變量
咱們能夠直接在lambda表達式中訪問外層的局部變量
final int num = 1;
Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num);
stringConverter.convert(2);
可是和匿名對象不一樣的是,這裏的變量num能夠不用聲明爲final,該代碼一樣正確。
七、訪問對象字段與靜態變量
和本地不良不一樣的是,lambda內部對於實例的字段以及靜態變量是便可讀又可寫。該行爲和匿名對象是一致的:
static int outerStaticNum;
int outerNum;
public void testScopes() {
    Converter stringConverter1 = (from) -> {
        outerNum = 23;
        return String.valueOf(from);
    };
    Converter stringConverter2 = (from) -> {
        outerStaticNum = 72;
        return String.valueOf(from);
    };
}
八、訪問接口的默認方法
九、Date API
十、Annotation註解javascript

相關文章
相關標籤/搜索