JDK十、JDK十一、JDK12新特性

JDK10新特性

一、var聲明變量

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

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

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

參考一下示例:算法

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>

二、移除javah

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

三、IO流你們族添加charset參數

其它

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

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

JDK11新特性

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

一、HTTPClient轉正

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

二、密碼學方面的改進

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

三、java命令運行java文件

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

四、廢棄Nashorn JavaScript引擎

Nashorn被廢棄,GraalVM爲推薦引擎。編程語言

五、更靈活的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

六、更方便的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新特性

一、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;
});

二、數字轉字符串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));

三、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));
}

其它

JDK12放棄了對jdk6及其之前版本的支持。

參考資料

https://www.cnblogs.com/peter1018/p/9234490.html https://segmentfault.com/a/1190000016527932 https://www.oschina.net/news/98314/java-11-api-changes-so-far

相關文章
相關標籤/搜索