String的valueOf方法原始碼解讀
阿新 • • 發佈:2018-11-08
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)
方法實現避免了CalssCastException
和NullPointerException
,但是要注意,如果物件為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);
}