Java中string.trim()究竟去掉了哪些字符
创始人
2024-12-24 09:41:42
0次

String.Trim()方法到底为我们做了什么,仅仅是去除字符串两端的空格吗?

trim()方法去掉了哪些字符?  trim()/substring()怎样返回字符串对象?

trim()方法去掉了哪些字符?

在Stack Overflow上看到一个问题(点此查看):

I am receiving a string from server trailing one or two lines of spaces like below given string.

String str = "abc*******          ********";

Consider * as spaces after my string

i have tried a few methods like

str = str.trim();str = str.replace(String.valueOf((char) 160), " ").trim();str = str.replaceAll("\u00A0", "");

but none is working. Why i am not able to remove the space?

为此看了一下trim()方法的源码,发现挺有意思的。

先看下面的代码:

public static void main(String[] args) {     String str = "abc";     System.out.println(str.length());     str = str.trim();     System.out.println(str.length());  }

我不清楚各位在刚学习Java的时候老师(或者书上)是怎么说的,我入门是看毕向东老师的视频,当时毕向东老师说的是trim()方法会去掉字符串两端的空格;后来看《Java核心技术》的时候,书上说的时“返回一个新的字符串。这个字符串将删除了原始字符串头部和尾部的空格。”(第9版的中文版,在卷一51页20行。)所以我一直理所当然地认为trim()方法会trim掉字符串两端的“空格”,也正是如此,我看到源码的时候才会觉得很有意思。

不说别的,上面代码输出的是9、3,也就是字符串尾部的””被trim()掉了。

更有意思的是,如果你把上面的代码copy到Notepad++上,它长成这样:

而在Eclipse上,它长这样:

没错,这个特殊的符号在Eclipse上是看不到、不占任何“空间”的,如果我们不小心在代码中混入这样的字符,估计排错会很痛苦……

再接入正题,现在我们知道了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;  }

原文的”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); // false     System.out.println(str3 == str2); // true  }

str1.trim()返回的字符串为”abc”,而在常量池中已经确定存在这个”abc”这个String对象,那为何str1==str2不成立呢? 我们看trim()方法的最后一行:

return ((st > 0) || (len < value.length)) ? substring(st, len) : this;

也就是说,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);  }

我们看到,当实际发生了”截取“这个动作的时候,因为此处无法直接声明一个String常量,即substring()无法像我们写String str = “abc”这样直接在常量池中创建对象,所以它返回的是一个new出来的对象,这个对象位于Heap内存中。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...