千家信息网

Java中string.trim()究竟去掉了哪些字符

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章给大家分享的是有关Java中string.trim()究竟去掉了哪些字符的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。String.Trim()方法到底为我们做了什
千家信息网最后更新 2026年10月31日Java中string.trim()究竟去掉了哪些字符

这篇文章给大家分享的是有关Java中string.trim()究竟去掉了哪些字符的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

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内存中。

感谢各位的阅读!关于"Java中string.trim()究竟去掉了哪些字符"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

字符 字符串 方法 空格 对象 两端 代码 时候 有意思 实际 常量 源码 空白 编码 老师 清楚 也就是 内容 实际上 尾部 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州万易互联网科技有限公司 蓝思科技飞鸽互联网 科技赋能下的互联网金融 互联网核心科技是什么 互联网与新科技 碳银互联网科技有限公司 多迪互联网科技有限公司 成都互联网科技公司100强 厦门比较好的科技互联网公司 互联网科技革命什么开始 互联网新科技动漫ppt素材 乌鲁木齐新华智原互联网科技学校 华夏恒生科技与互联网科技 威龙国际互联网科技公司 互联网科技大赛获奖感言 互联网科技公司营业执照怎么办理 梅州GM互联网络科技有限公司 四川互联网展示科技馆设计 富国互联网科技002692 广西科技产业互联网是什么 互联网科技图片 为想互联网科技怎么样 中国互联网科技发展 互联网科技缩写 互联网科技英文翻译 顺网科技2021年互联网排名 互联网数据科技专业 工业互联网展湾科技股份有限公司 广州智享互联网科技 广州三三互联网科技有限公司
0