1. 程式人生 > >String的valueOf方法原始碼解讀

String的valueOf方法原始碼解讀

valueOf 中的祕密

String中的valueOf方法大致可以分為三種:
String.valueOf(Object)、String.valueOf(char[])、String.valueOf(基本資料型別)
這裡寫圖片描述

案例:

Integer arg = null;
String.valueOf(arg); // 輸出 null
String.valueOf(null); // 拋java.lang.NullPointerException

為什麼?
因為Java中所有類的頂級父類都是Object,從Java過載方法的執行這篇文章中我們知道,方法過載時,char[]陣列優先於Object

,因此null會呼叫String.valueOf(char[])方法。對於Integer arg = null;與陣列型別不匹配,因此呼叫String.valueOf(Object)方法。

String.valueOf(Object)原碼:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

String.valueOf(char[])原碼:

public static String valueOf(char data[]) {
    return
new String(data); } public String(char value[]) { this.value = Arrays.copyOf(value, value.length); }

使用技巧

物件轉成String型別,有三種方法:強轉、.toString()、String.valueOf(Object)。

  • 強轉
    只有型別匹配的才可以強轉,例如Object obj = new Integer(10); String str = (String) obj;會拋CalssCastException異常
  • .toString()
    必須保證物件不為null
    ,否則拋NullPointerException異常
  • String.valueOf(Object)
    方法實現避免了CalssCastExceptionNullPointerException,但是要注意,如果物件為null,那麼返回的值是"null"字串,而不是null。一定要注意這一點,在實際開發中,這個方法是比較常用的。

開發中的應用

例如兩個人A和B對接介面,A傳送一些資料給B,B去解析
A:

// 傳送的資料為 Integer 型別
Object arg = new Integer(2);
// 傳送給B的虛擬碼
send(arg);

B:

// 接收A引數的虛擬碼
Object arg = receive();
// B知道引數是一個數值型別的,但是B這邊不知道A發的具體的型別
// Long rec = (Long) arg; 報錯了,因為型別轉換異常
// 使用 String.valueOf 可以避免
String rec = String.valueOf(arg);
if(!"null".equals(rec)){
    Long result = Long.valueOf(rec);
}