Java基礎之 String.trim() 究竟去掉了什麼?
目錄
說在前面
某一天,有人問我,String.tirm()是做什麼的?
我的回答是:去除兩邊空格字串。
“確定嗎?中的能能去嗎?”
……
trim()
trim()方法去掉了哪些空格?
為什麼這麼說,的確 這個方法就是為了 去除 首尾空格來用的。
為了 簡單理解,先舉個栗子:
可能都知道是用來去除空格的“ ”,無論多少空格都會去除,但是《Java核心技術》這本書上說的是“返回一個新的字串。這個字串將刪除了原始字串頭部和尾部的空格。
記住是 頭部 和 尾部。中間的可以嗎?
執行結果 是中間不可以。
再舉個栗子,平常可能很少遇到:
空格(空白)也可以在全形中使用,當是全形的時候 會不會生效呢?
答案很顯然,是不可以的。
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字串。
雖然這些都是基礎中的基礎,但是若基礎不好,將來什麼都不好。