Java基础之 String.trim() 究竟去掉了什么?

版权声明:本博客所有内容采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可 https://blog.csdn.net/Soinice/article/details/84638146

目录

说在前面

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字符串。

虽然这些都是基础中的基础,但是若基础不好,将来什么都不好。

猜你喜欢

转载自blog.csdn.net/Soinice/article/details/84638146