【Java利器】JDK5-9新特性解析+程式碼 - JDK7

weixin_33890499發表於2018-01-31

本文主要介紹JDK7的新特性。


目錄

  • 1.語法上支援集合,而不一定是陣列[錯誤,謠傳]
  • 2.switch中可以使用字串了
  • 3.泛型例項化型別自動推斷
  • 4.新增一些取環境資訊的工具方法
  • 5.Boolean型別反轉,空指標安全,參與位運算
  • 6.兩個char間的equals
  • 7.安全的加減乘除
  • 8.二進位制變數的表示,支援將整數型別用二進位制來表示,用0b開頭。
  • 9.Try-with-resource語句
  • 10.使用一個catch語言來處理多種異常型別

1.語法上支援集合,而不一定是陣列[錯誤,謠傳]

在網上的栗子中,下面這段程式碼一般用來表示JDK7新特性語法上支援集合,然而經過驗證,這是一個錯誤的描述,JDK7並沒有這個特性;作者用JDK8來測試都報語法錯誤,請大家注意不要上當!!!


final List<Integer> piDigits = [ 1,2,3,4,5,8 ];   

下面是驗證程式碼:


1835546-a2fc66fff3130e43
錯誤驗證圖片

2.switch中可以使用字串了

String s = "test";
switch (s) {
  case "test":
      System.out.println("test");
  case "test1":
      System.out.println("test1");
      break;
  default:
      // 阿里巴巴開發規範中,預設都需要加default
      System.out.println("default");
      break;
}

3.泛型例項化型別自動推斷

在前兩章講到的JDK5中支援了泛型型別,我們需要在宣告並賦值的時候,兩側都加上泛型型別。例如:


Map<String, String> map = new HashMap<String, String>();

在JDK7中,這種方式得以改進,現在你可以使用如下語句進行宣告並賦值:


// 後面的"<>"可以不宣告型別,PS:正常使用時儘量在new HashMap<>()括弧中宣告初始大小
Map<String, String> map = new HashMap<>();

4.新增一些取環境資訊的工具方法

JDK7的工具方法如下:


// IO臨時資料夾
File System.getJavaIoTempDir(); 

// JRE的安裝目錄
File System.getJavaHomeDir();

// 當前使用者目錄
File System.getUserHomeDir();

// 啟動Java程式時所在的目錄
File System.getUserDir();

PS:上面的幾個方法在JDK8及以上版本都已經被作廢,現在JDK8的新方法如下:


// 屬性類
Properties properties = System.getProperties();

// IO臨時資料夾
System.out.println(properties.getProperty("java.io.tmpdir"));

// JRE的安裝目錄
System.out.println(properties.getProperty("java.home"));

// 當前使用者目錄
System.out.println(properties.getProperty("user.home"));

// 啟動Java程式時所在的目錄
System.out.println(properties.getProperty("user.dir"));

如果想看到 Properties 中有多少的可顯示屬性,可使用以下程式碼來查詢:


// 列印出所有的屬性
System.out.println(System.getProperties().toString());

5.Boolean型別反轉,空指標安全,參與位運算


Boolean Booleans.negate(Boolean booleanObj)

True => False , False => True, Null => Null

boolean Booleans.and(boolean[] array)

boolean Booleans.or(boolean[] array)

boolean Booleans.xor(boolean[] array)

boolean Booleans.and(Boolean[] array)

boolean Booleans.or(Boolean[] array)

boolean Booleans.xor(Boolean[] array)

6.兩個char間的equals

下面是JDK7中的比較方法:


boolean Character.equalsIgnoreCase(char ch1, char ch2)

在JDK8及以上,此方法已作廢,JDK8常用的比較方法有兩種,程式碼如下:


char a = '5';
char b = '3';
// 第一種,使用 < > = != 運算子來判定,結果是:true 或者 false
System.out.println(a > b);
// 第二種,底層使用 a - b 的形式來實現,結果是:等於返回0,大於返回0以上,小於返回0以下
System.out.println(Character.compare(a, b));

7.安全的加減乘除


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)

8.二進位制變數的表示,支援將整數型別用二進位制來表示,用0b開頭。


// 所有整數 int, short,long,byte都可以用二進位制表示
// An 8-bit 'byte' value:
byte aByte = (byte) 0b00100001;

// A 16-bit 'short' value:
short aShort = (short) 0b1010000101000101;

// Some 32-bit 'int' values:
int anInt1 = 0b10100001010001011010000101000101;
int anInt2 = 0b101;
int anInt3 = 0B101; // The B can be upper or lower case.

// A 64-bit 'long' value. Note the "L" suffix:
long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L;

// 二進位制在陣列等的使用
final int[] phases = { 0b00110001, 0b01100010, 0b11000100, 0b10001001,
      0b00010011, 0b00100110, 0b01001100, 0b10011000 };

9.Try-with-resource語句

這個所謂的try-with-resources,是個語法糖。實際上就是自動呼叫資源的close()函式。和Python裡的with語句差不多。
例如:


static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

可以看到try語句多了個括號,而在括號裡初始化了一個BufferedReader。
這種在try後面加個括號,再初始化物件的語法就叫try-with-resources。
實際上,相當於下面的程式碼(其實略有不同,下面會說明):


static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
        if (br != null) br.close();
    }
}

很容易可以猜想到,這是編繹器自動在try-with-resources後面增加了判斷物件是否為null,如果不為null,則呼叫close()函式的的位元組碼。
只有實現了java.lang.AutoCloseable介面,或者java.io.Closable(實際上繼隨自java.lang.AutoCloseable)介面的物件,才會自動呼叫其close()函式。
有點不同的是java.io.Closable要求一實現者保證close函式可以被重複呼叫。而AutoCloseable的close()函式則不要求是冪等的。

10.使用一個catch語言來處理多種異常型別


public static void main (String[] args) throws Exception {
    try {
        testthrows();
        // 具體點在下面這個 | 符號,或者
    } catch (IOException | SQLException ex) {
        throw ex;
    }
}
public static void testthrows ()throws IOException, SQLException {
  
}

下一篇應該是講JDK8的新特性了,這篇文章中有網路謠傳的錯誤資訊,已標出,所以請大家在閱讀網路文章之後,也不要盡信,最好是自己手動試一試程式碼,查查文件,一切都出來了。

看都看了,關注一下唄!!!

掃描下面二維碼,關注我的公眾號哦!!!


1835546-c4a5fedfa14556f8
關注我的公眾號

相關文章