1. 程式人生 > >Java基礎之 String.trim() 究竟去掉了什麼?

Java基礎之 String.trim() 究竟去掉了什麼?

目錄

說在前面

trim()

trim()方法去掉了哪些空格?

trim()方法 原始碼

trim() 究竟去掉了什麼?

trim()/substring()怎樣返回字串物件?

總結


說在前面

某一天,有人問我,String.tirm()是做什麼的?

我的回答是:去除兩邊空格字串。

“確定嗎?中的能能去嗎?”

……

trim()

trim()方法去掉了哪些空格?

為什麼這麼說,的確 這個方法就是為了 去除 首尾空格來用的。

為了 簡單理解,先舉個栗子:

可能都知道是用來去除空格的“ ”,無論多少空格都會去除,但是《Java核心技術》這本書上說的是“返回一個新的字串。這個字串將刪除了原始字串頭部和尾部的空格。

”(第9版的中文版,在卷一51頁20行。)

記住是 頭部 和 尾部。中間的可以嗎?

執行結果 是中間不可以

再舉個栗子,平常可能很少遇到:

空格(空白)也可以在全形中使用,當是全形的時候 會不會生效呢?

答案很顯然,是不可以的。

trim()方法 原始碼

 

從 圖中 可以看到,方法 return的是 一個 String,進行 處理 完成的 新的String,substring 的字串。

trim() 究竟去掉了什麼?

至於翻譯,我就不用翻譯了,但是原文的”white space“中文直譯為”留白“或”空白“,但是常見文件一般翻譯為”空格“,而空格的英文一般應譯為”blank”或”space”,所以我認為這裡的翻譯不夠準確(當然原始碼註解也沒有寫得很清楚),而且會引起歧義:trim()方法實際上trim掉了字串兩端Unicode編碼小於等於32(\u0020)的所有字元。

所以 上面所說的,全形 不可以也是有原因的。' '的Unicode編碼為:12288,如果遇到去不掉的空格(空白),不妨就去研究研究到底是不是真的空格“ ”。

trim()/substring()怎樣返回字串物件?

剛才看到原始碼,也知道,他是返回的了一個新的 String 物件。如果不信,可以比較一下:

str1.trim()返回的字串為”Hello”,而在常量池中已經確定存在這個”Hello”這個String物件,那為何str1==str2不成立呢? 
我們看trim()方法的最後一行:

也就是說,trim()方法實際上的行為並不是”去掉兩端的空白字元“,而是”擷取中間的非空白字元“

。 
再看substring()方法:

我們看到,當實際發生了”擷取“這個動作的時候,因為此處無法直接宣告一個String常量,即substring()無法像我們寫String str = “abc”這樣直接在常量池中建立物件,所以它返回的是一個new出來的物件,這個物件位於Heap記憶體中。

總結

看完原始碼,其實都 恍然大悟了,就算別人怎麼問你,你也不會難倒了。其實,就記住,是去掉空格,且是去掉 字串兩端中英文情況下的半形空格,實在不行,就直接說,是去掉字串兩端Unicode編碼小於等於32(\u0020)的所有字元,如果別人還問,你就說,去掉兩端的空白字元,擷取中間的非空白字元,並且返回一個新的String字串。

雖然這些都是基礎中的基礎,但是若基礎不好,將來什麼都不好。