1. 程式人生 > >toString()、new String()和(String) 、String.ValueOf()的區別

toString()、new String()和(String) 、String.ValueOf()的區別

先來看段程式碼:

String str="hello";
String base64Encoded=Hex.encodeToString(str.getBytes());
String str2=new String(Hex.decode(base64Encoded)); 
String str3=(Hex.decode(base64Encoded)).toString(); //str3的值為[[email protected]
System.out.println(str2.equals(str));
System.out.println(str3.equals(str));

第一個輸出結果為true,第二個輸出結果為false這是為什麼呢?
原來,toString()方法是呼叫了這個object物件的toString方法。一般是返回這麼一個String:[class name]@[hashCode],即物件在記憶體中的地址。在這種使用方法中,因為java.lang.Object類裡已有public方法.toString(),所以對任何嚴格意義上的java物件都可以呼叫此方法。但在使用時要注意,必須保證object不是null值,否則將丟擲NullPointerException異常。採用這種方法時,通常派生類會覆蓋Object裡的toString()方法。
而new String(b)是根據parameter是一個位元組陣列,使用java虛擬機器預設的編碼格式,將這個位元組陣列decode為對應的字元。若虛擬機器預設的編碼格式是ISO-8859-1,按照ascii編碼表即可得到位元組對應的字元。所以new String()

方法返回的才是真實的值
再來看(String)
Object obj = new Integer(100);
String strVal = (String)obj;
在執行時將會出錯,因為將Integer型別強制轉換為String型別,無法通過。如下圖:
這裡寫圖片描述

這是因為,這種標準的型別轉換,將object轉成String型別的值。使用這種方法時,需要注意的是型別必須能轉成String型別。因此最好先用instanceof做個型別檢查,以判斷是否可以轉換。否則容易丟擲ClassCastException異常。此外,需特別小心的是因定義為Object 型別的物件在轉成String時語法檢查並不會報錯,這將可能導致潛在的錯誤存在。這時要格外小心。
最後再來看String.valueOf()
這個方法是靜態的,直接通過String呼叫,可以說是完美,只是平時使用不多,這樣的實現避免了前面兩個的不足和缺點。首先來看看他內部的實現機制:

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

從這可以看出,其在內部就是作了為空的判斷的,所以就不會報出空指標異常。  

但我們也要很清醒地認識到,當object為null 時,String.valueOf(object)的值是字串”null”,而不是null!!!在使用過程中切記要注意。我們可以使用以下程式碼進行檢驗:

Object obj = null;
System.out.println(String.valueOf(obj) + "->此處null的型別是"
+ String.valueOf(obj).getClass()); System.out.println(obj);

我們看到的輸出將是一模一樣的東西:null,但它們意義其實並不相同。

相關推薦

StringStringBuilderStringBuffer的區別

stringbu 其中 線程 沒有 平臺 zed 對象 修飾 java平臺 Java平臺提供了兩種類型的字符串:String和StringBuffer/StringBuilder,它們可以儲存和操作字符串。其中String是只讀字符串,也就意味著String引

[java]StringDateTimestamp之間的轉換

方式 父類 print 關系 否則 get pre rac pri 一、String與Date(java.util.Date)互轉 1.1 String -> Date Date date = DateFormat.parse(String str); Stri

String StringBuilderStringBuffer 的區別?

答:Java 平臺提供了兩種型別的字串:String 和StringBuffer / StringBuilder,它們可以儲存和操作字元 串。其中 String 是隻讀字串,也就意味著 String 引用的字串內容是不能被改變的。而 StringBuffer 和 Stri ngBuilder

Stringstringbufferstringbuilder的區別

從執行速度與執行緒安全兩個方面看: String型別的變數是作為字元常量儲存,後兩者是作為字元變數儲存。也就是String物件是不可變的。 所以,當字串不進行大量操作的時候String物件的執行速度是最快的。 當需要對字串進行修改操作的時候,Sting是最慢的。 總體

StringDateTimestamp之間的轉換

一、String與Date(java.util.Date)互轉      1.1 String -> Date 編碼:   String dateStr = "2010/05/04 12:34:23";           Date date = new D

Java:StringDateTimestamp之間的轉換

一、String與Date(java.util.Date)互轉 // 1.1、String -> Date @org.junit.Test public void testStringToDate() throws ParseException

StringintInteger間的轉換

int i=123;String s="";一、Integer轉換成int的方法Integer.intValue();Integer i = new Integer(10); int k = i.intValue(); 二、int轉換成Integerint i = 10;

Stringequals()hashCode()

Object中的“==”,equal,hashCode() Object中的== 對於基本資料型別,“==”比較值是否相同。 對於引用資料型別, “==”比較記憶體中的存放地址是否相同。 Object中的equals() public boole

Java下StringList<String>的互相轉換

pan int blank 參考 net onu array pos body // List轉換為String數組 List<String> list = new ArrayList<String>(); list.add("a1"

String[]List<String>的區別及相互轉換

Hello,everybody。好幾天不見啦,我一直在想著怎麼整場大戲,琢磨寫個好點的文章。(其實是因為玩了一個星期,emmmm,因為懶)。 1.兩者的區別 結構方面: List< String >:泛型,非定長,可變。 String[]:陣列,定長,不可

String +StringBuilder的append的區別

字串連線,用+進行連線,其實內部也是通過StringBuilder的append來實現的; 一般情況進行字串拼接用+就可以,系統內部會進行優化,但是如果是迴圈拼接,則需要用StringBuilder的append來實現; 原因:因為如果是迴圈拼接,那麼系統會在迴圈體內部建立Stri

java中StringStringBuffer的傳參與區別

1.String和StringBuffer的傳遞 在一個論壇裡看到說:java裡只有值傳遞 可以這樣理解吧:在java中的引用傳遞是通過物件實現的。(一個物件的值其實是這個物件的地址) str

StringStringBuffer以及StringBuilder的區別

今天在讀《java程式設計思想》的時間,在看到String和StringBuffer以及StringBuffer這三個類的時間,做一個隨筆小結,為自己的面試做好準備! 一:String,Stri

mybatis返回型別resulttype之stringjava.lang.string的不同點

專案部署到linux系統上,其實select語句返回型別resulttype使用string或者java.lang.string差別其實應該是沒有的,但是最好使用string,不然可能會出現異常,而且

Integernew Integer() int 比較的面試題

data 不解釋 .com 面試 常量 oid com assert itl 基本概念的區分: 1、Integer 是 int 的包裝類,int 則是 java 的一種基本數據類型2、Integer 變量必須實例化後才能使用,而int變量不需要3、Integer 實際是對

Windows10下python3python2同時安裝 python2.exepython3.exepip2pip3設置

bsp net 運行 安裝python all 能夠 命令 自動添加 exe 1、添加python2到系統環境變量 打開,控制面板\系統和安全\系統,選擇高級系統設置,環境變量,選擇Path,點擊編輯,新建,分別添加D:\Python\python27和D:\P

JavaScript學習總結(三函數聲明表達式this閉包引用arguments對象函數間傳遞參數)

rem [1] incr foo i++ scrip erro ren 推薦 一、函數聲明和表達式 函數聲明: function test() {}; test(); //運行正常 function test() {}; 函數表達式: var test = fun

IEDOM事件流普通事件綁定事件的區別

strong clas doc cap () 添加多個 nbsp class 器) IE和DOM事件流的區別 IE采用冒泡型事件 Netscape(網絡信息瀏覽器)使用捕獲型事件 DOM使用先捕獲後冒泡型事件 示例: <body> <div

參數匿名函數字典排序生成式生成器裝飾器的作用

args turn generator 方式 小括號 一個 中括號 ecb bject 參數匿名函數字典排序 *args就是一個元組**dict就是字典 生成式和生成器 [x*x for x in range(0,10)] //列表生成式,這裏是中括號//結果 [0,

MySQL主從配置:主從介紹配置主測試主從同步

mysql主從配置 MySQL主從介紹(兩臺機器數據同步)主:-->binlog從:-->relaylog主上有一個log dump線程,用來和從的I/O線程傳遞binlog 從上有兩個線程,其中I/O線程用來同步主的binlog並生成relaylog,另外一個SQL線程用來