天天看點

java9 變化_java9新特性

1.jdk的目錄結構變化

jdk9的安裝檔案夾中不包含jre檔案夾,eclispe在低的版本中無法加載jdk9

2.接口中聲明私有方法

public interface InterfaceTest {

//java9新特性,可以在接口中添加私有的方法

private void test() {

System.out.println("InterfaceTest.test");

}

}

3.鑽石符能夠與匿名内部類一起使用

public class DeamonInnerTest {

//java9中才能這麼使用,在java8中鑽石符不能與匿名内部類一起使用

public static void main(String[] args) {

ArrayList list = new ArrayList<>(){

};

}

}

4.java8在try的小括号裡面聲明的資源會自動的關閉,是以不用寫finally,但是不能用括号外的執行個體化對象,但是java9可以,但是不可再次指派,被預設的加上final

public class TryTest {

public static void main(String[] args) throws FileNotFoundException {

//java8中能這麼使用

try( FileInputStream fileInputStream= new FileInputStream("ss")){

fileInputStream.read();

} catch (IOException e) {

e.printStackTrace();

}

//java8不能按如下使用 java9中才可以這可使用

FileInputStream fileInputStream = new FileInputStream("ss");

try( fileInputStream){

fileInputStream.read();

} catch (IOException e) {

e.printStackTrace();

}

//java9中不能這麼使用

FileInputStream fileInputStream1 = null;

try( fileInputStream1= new FileInputStream("ss")){

fileInputStream1.read();

} catch (Exception e) {

e.printStackTrace();

}

}

}

5._下劃線不能單獨使用

public class _Test {

public static void main(String[] args) {

//java9 中不能這麼使用 java8中可以

String _=null;

}

}

6.String的底層存儲不再是字元數組,改成了位元組數組,StringBuffer,StringBuilder也是做了相應的改變,減少記憶體的占用

// private final byte[] value; java9源碼

// private final char value[]; java8源碼

7.集合的隻讀隻用List.of,Set.of等方法就可以了,較以前的方法更為簡單

public class OnlyReadTest {

public static void main(String[] args) {

//java9新增的建立隻讀的集合

List integers = List.of(1, 2, 3, 4, 5);

//java8中設定隻讀集合如下

List integers1 = Arrays.asList(1, 2, 3, 4, 5);

Collections.unmodifiableList(integers1);

//其他類似Set,Map等

}

}

8.增強Stream API

新增takeWhile方法是遇到不合适的就不跑了,取之前的元素,而filter是一緻跑到末尾,

新增dropWhile與takewhile相反取的是後續的元素,遇到不合适的就不跑了,取之後的元素,包括自身

新增ofNullable方法是允許是以的元素為null的,而在java8中需要不全為null

在疊代無線流上新增了一個可以斷言的重載方法

public class StreamTest {

public static void main(String[] args) {

//java9新增的takeWhile方法 1 4 8

Stream.of(1,4,8,9,11,5,6).takeWhile((x)->x<9).forEach(System.out::print);

//java9新增的dropWhile方法 9 11 5 6

Stream.of(1,4,8,9,11,5,6).dropWhile((x)->x<9).forEach(System.out::print);

//java8中的stream不能全部為null,會報空指針異常 java.lang.NullPointerException

// Stream.of(null).forEach(System.out::println);

//java9新增方法是的不會出現空指針異常

Stream.ofNullable(null).forEach(System.out::println);

//java9在遞歸流中新增重載方法

Stream.iterate(0,(x)->x>10,(x)->x+1);

//java8中隻能這麼使用

Stream.iterate(0,(x)->x+1).limit(5);

}

}

9.在optional中添加了可以擷取Stream的方法

public class OptinalStreamTest {

public static void main(String[] args) {

//4 5

List integers = Arrays.asList(1, 4, 5);

Optional.of(integers).stream().flatMap((x)->x.stream()).filter((x)->x>3).forEach(System.out::print);

}

}

10.提供了一個新的Api,HttpClient,替代僅适用于blocking模式的HttpURLConnection (HttpURLConnection是在HTTP 1.0的時代建立的,并使用了協定無關的方法),并提供對WebSocket 和 HTTP/2的支援。(HTTP/1.1和HTTP/2的主要差別是如何在用戶端和伺服器之間建構和傳輸資料。HTTP/1.1依賴于請求/響應周期。 HTTP/2允許伺服器“push”資料:它可以發送比用戶端請求更多的資料。 這使得它可以優先處理并發送對于首先加載網頁至關重要的資料。)

public class HttpClientTest {

public static void main(String[] args) throws IOException, InterruptedException {

HttpClient httpClient = HttpClient.newHttpClient();

HttpRequest build = HttpRequest.newBuilder(URI.create("https://www.baidu.com/")).GET().build();

HttpResponse send = httpClient.send(build, HttpResponse.BodyHandler.asString());

System.out.println(send.statusCode());

System.out.println(send.version().name());

System.out.println(send.body());

}

}

//src 右鍵 建立module-info.java

module modeltest {

requires jdk.incubator.httpclient;

}

11.新的API定義在java.awt.image包下,将不同分辨率的圖像封裝到一張(多分辨率的)圖像中,作為它的變體,基于目前螢幕分辨率大小和運用的圖像轉換算法,

java.awt.Graphics類可以從接口MultiResolutionImage擷取所需的變體。

12.以前的版本是支援html4現在支援html5

13.子產品化module

module muduletest1 {

//導入子產品

requires muduletest2;

}

package cn.muduletest1;

import cn.muduletest2.Person;

public class ModuleTest {

public static void main(String[] args) {

Person person = new Person();

}

}

module muduletest2 {

//導出包

exports cn.muduletest2;

}

package cn.muduletest2;

public class Person {

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}