本文主要是介绍java 中 String 成员 trim(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我不清楚各位在刚学习Java的时候老师(或者书上)是怎么说的,我入门是看毕向东老师的视频,当时毕向东老师说的是trim()方法会去掉字符串两端的空格;后来看《Java核心技术》的时候,书上说的时“返回一个新的字符串。这个字符串将删除了原始字符串头部和尾部的空格。”(第9版的中文版,在卷一51页20行。)所以我一直理所当然地认为trim()方法会trim掉字符串两端的“空格”,也正是如此,我看到源码的时候才会觉得很有意思。
现在我们知道了trim()方法不只trim掉空格那么简单,那么它究竟trim掉了些什么东西?我们不妨来看一下。
/** * @return A string whose value is this string, with any leading and trailing white *
space removed, or this string if it has no leading or *
trailing white space. */
public String trim() {
int len = value.length;
int st = 0;
char[] val = value; /* avoid getfield opcode */
while ((st < len) && (val[st] <= ' '))
{ st++;
}
while ((st < len) && (val[len - 1] <= ' '))
{ len--; }
return ((st > 0) || (len < value.length)) ? substring(st, len) : this; // beginidex endindex
}
原文的”white space“中文直译为”留白“或”空白“,但是常见文档一般翻译为”空格“,而空格的英文一般应译为”blank”或”space”,所以我认为这里的翻译不够准确(当然源码注解也没有写得很清楚),而且会引起歧义:trim()方法实际上trim掉了字符串两端Unicode编码小于等于32(\u0020)的所有字符。
System.out.println("' '的Unicode编码为:" + (int)' '); // ' '的Unicode编码为:32
trim()/substring()怎样返回字符串对象?
再看另外一个问题:
public static void main(String[] args) {String str1 = "abc ";String str2 = "abc";String str3 = "abc";str1 = str1.trim();System.out.println(str1 == str2); // falseSystem.out.println(str3 == str2); // true}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
str1.trim()返回的字符串为”abc”,而在常量池中已经确定存在这个”abc”这个String对象,那为何str1==str2不成立呢?
我们看trim()方法的最后一行:
return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
- 1
也就是说,trim()方法实际上的行为并不是”去掉两端的空白字符“,而是”截取中间的非空白字符“。
再看substring()方法:
public String substring(int beginIndex, int endIndex) {if (beginIndex < 0) {throw new StringIndexOutOfBoundsException(beginIndex);}if (endIndex > value.length) {throw new StringIndexOutOfBoundsException(endIndex);}int subLen = endIndex - beginIndex;if (subLen < 0) {throw new StringIndexOutOfBoundsException(subLen);}return ((beginIndex == 0) && (endIndex == value.length)) ? this: new String(value, beginIndex, subLen);}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
当实际发生了”截取“这个动作的时候,因为此处无法直接声明一个String常量,即substring()无法像我们写String str = “abc”这样直接在常量池中创建对象,
'所以它返回的是一个new出来的对象,这个对象位于Heap内存中。
这篇关于java 中 String 成员 trim()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!