JDK10、JDK11、JDK12新特性

JDK10新特性

1、var聲明變量

很多人抱怨Java是一種強類型,需要引入大量的樣板代碼。甚至在這些情況下,給定好變量名,通常很清楚發生了什麼,明顯類型聲明往往被認爲是不必要的。許多流行的編程語言都已經支持某種形式的局部變量類型推斷:如C++ (auto), C# (var), Scala (var/val), Go (declaration with :=)等。

JDK10 可以使用var作爲局部變量類型推斷標識符,此符號僅適用於局部變量,增強for循環的索引,以及傳統for循環的本地變量;它不能使用於方法形式參數,構造函數形式參數,方法返回類型,字段,catch形式參數或任何其他類型的變量聲明。

標識符var不是關鍵字;相反,它是一個保留的類型名稱。這意味着var用作變量,方法名或則包名稱的代碼不會受到影響;但var不能作爲類或則接口的名字(但這樣命名是比較罕見的,因爲他違反了通常的命名約定,類和接口首字母應該大寫)。

參考一下示例:

var str = "ABC"; //根據推斷爲 字符串類型
var l = 10L;//根據10L 推斷long 類型
var flag = true;//根據 true推斷 boolean 類型
var flag1 = 1;//這裏會推斷boolean類型。0表示false 非0表示true
var list = new ArrayList<String>();  // 推斷 ArrayList<String>
var stream = list.stream();          // 推斷 Stream<String>

2、移除javah

移除Native-Header Generation Tool (javah)
JDK10 從JDK中移除了javah 工具。該工具已被JDK8 (JDK-7150368)中添加javac高級功能所取代。此功能提供了在編譯java源代碼時編寫本機頭文件的功能,從而無需使用單獨的工具。

3、IO流大家族添加charset參數

其它

JDK10中包含許多對JVM的優化:

  • 將JDK多存儲庫合併爲單存儲庫
  • 並行Full GC 的G1
  • 垃圾回收接口
  • 應用數據共享
  • 線程局部管控
  • 基於實驗JAVA 的JIT 編譯器
  • 備用內存設備上分配堆內存

JDK11新特性

Java的改進提議被稱爲JEP(JDK Enhancement Proposal 特性增強提議),JDK11是Java改爲6月一版之後的第一個LTS版本。

1、HTTPClient轉正

JDK9中便引入httpclient模塊,但它在jdk.incubator.httpclient包下,在java11被標記爲正式,改爲java.net.http模塊。

2、密碼學方面的改進

  • 使用RFC 7748中描述的Curve25519和Curve448實現key agreement
  • 實現 RFC 7539的ChaCha20 and ChaCha20-Poly1305加密算法

3、java命令運行java文件

java Haha.java直接輸出javac Haha.java &&java Haha的結果。

4、廢棄Nashorn JavaScript引擎

Nashorn被廢棄,GraalVM爲推薦引擎。

5、更靈活的String

去除空白

String text = "  \u2000a  b  ";
Assert.assertEquals("a  b",text.strip());
Assert.assertEquals("\u2000a  b",text.trim());
Assert.assertEquals("a  b  ",text.stripLeading());
Assert.assertEquals("  \u2000a  b",text.stripTrailing());

trim()和strip()的區別

jshell> var aaa = fullSpace + "aaa" + fullSpace
aaa ==> " aaa "

jshell> aaa.strip()
$14 ==> "aaa"

jshell> aaa.trim()
$15 ==> " aaa "

lines()

字符串實例方法,使用專門的 Spliterator 來懶惰地提供源字符串中的行

jshell> "test\nhoge\n".lines().map(String::toUpperCase).toArray()
$11 ==> Object[2] { "TEST", "HOGE" }

repeat(int)

按照參數 int 提供的次數來重複字符串的運行次數

jshell> "test".repeat(3)
$7 ==> "testtesttest"

isBlank()

驗證當前字符串是否爲空,或者是否只包括空白字符(空白字符由 Character.isWhiteSpace(int) 驗證)

jshell> var halfSpace = "\u0020"
halfSpace ==> " "

jshell> halfSpace.isBlank()
$11 ==> true

jshell> var fullSpace = "\u3000"
fullSpace ==> " "

jshell> fullSpace.isBlank()
$13 ==> true

6、更方便的IO

Path

of(String, String...)
此前我們需要使用 Paths.get()。現在,我們像其他類一樣使用 of()。

Files

writeString(Path, CharSequence)
我們可以使用該方法來保存一個 String 字符串。

jshell> Files.writeString(Path.of("test.txt"), "Hello!!!")
$3 ==> test.txt
readString(Path)

我們可以使用該方法來讀取一個 String 字符串。

jshell> Files.readString(Path.of("test.txt"))
$4 ==> "Hello!!!"

Reader

nullReader()

使用該方法,我們可以得到一個不執行任何操作的 Reader。

Writer

nullWriter()
使用該方法,我們可以得到一個不執行任何操作的 Writer。

InputStream

nullInputStream()
使用該方法,我們可以得到一個不執行任何操作的 InputStream。

OutputStream

nullOutputStream()
使用該方法,我們可以得到一個不執行任何操作的 OutputStream。

JDK12新特性

1、switch語句

import java.io.IOException;

import static java.util.Calendar.*;

class Haha {

public static void main(String[] args) throws IOException, InterruptedException {
    var day = 2;
    switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
        case TUESDAY -> System.out.println(7);
        case THURSDAY, SATURDAY -> System.out.println(8);
        case WEDNESDAY -> System.out.println(9);
    }
}
}

switch也可以用作語句

System.out.println(switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY -> 7;
    case THURSDAY, SATURDAY -> 8;
    case WEDNESDAY -> 9;
    default -> -1;
});

2、數字轉字符串NumberFormat

var cnf = NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.SHORT);
System.out.println(cnf.format(1_0000));
System.out.println(cnf.format(1_9200));
System.out.println(cnf.format(1_000_000));
System.out.println(cnf.format(1L << 30));
System.out.println(cnf.format(1L << 40));
System.out.println(cnf.format(1L << 50));
System.out.println(NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.SHORT).format(12345));
System.out.println(NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.LONG).format(12345));

3、String的成員函數非常多

transform
java @Test public void testStringTransform(){ System.out.println("hello".transform(new Function<String, Integer>() { @Override public Integer apply(String s) { return s.hashCode(); } })); } ​
indent

@Test
public void testStringIndent(){
    System.out.println("hello".indent(3));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章