Java 中去除 String 中的空白字符的工具方法是 trim() ,源码如下:
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; }
这段代码是Java中String类的trim()方法的实现,其作用是从字符串的两端移除空白字符,包括空格、制表符、换页符等。下面是逐行的详细解读:
public String trim() {
定义了一个公共方法trim(),返回值类型为String。此方法不接收任何参数。
int len = value.length;
声明并初始化一个整型变量len,其值为当前字符串的长度。value是String类的一个私有final字段,它存储字符串的字符数组。
int st = 0;
声明并初始化一个整型变量st(起始索引),初始值设为0。这个变量将用来记录字符串开始不为空白字符的位置。
char[] val = value; /* avoid getfield opcode */
创建一个指向value的引用val。注释说明这样做是为了避免在循环体内直接访问value字段时产生额外的字段访问(getfield)操作码,从而略微提高运行效率。
接下来的两个while循环分别用于从字符串的开头和结尾移除空白字符。
while ((st < len) && (val[st] <= ' ')) { st++; }
这个循环从字符串的起始位置开始遍历,只要当前索引st小于字符串长度len且当前位置的字符是一个空白字符(ASCII值小于或等于空格字符的ASCII值),就将st加1,直到遇到非空白字符或到达字符串末尾。
这里重点提醒:
<= ' '
:这里的' '
是一个空格字符的表示,其ASCII值为32。比较操作<= ' '
用来检测当前检查的字符(即字符串末尾的那个字符)是否是一个空白字符,包括但不限于空格、制表符等。在ASCII码中,空格之后的字符(ASCII值大于32)被认为是非空白字符。因此,如果当前字符的ASCII值小于或等于32,这个条件就会成立,意味着字符是一个空白字符。
while ((st < len) && (val[len - 1] <= ' ')) { len--; }
这个循环从字符串的末尾向前遍历,只要当前字符串的有效长度len大于起始索引st且末尾位置的字符是一个空白字符,就将len减1,直到遇到非空白字符或st等于len。
return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
最后,根据st和len的值判断是否进行了修剪操作。如果st大于0,说明移除了前导空白;如果len小于原始长度,说明移除了尾随空白。任一条件满足,则使用substring(st, len)方法返回一个新的、两端无空白字符的字符串。如果两端都没有空白字符被移除(即st仍为0且len仍等于原长度),则直接返回当前对象(this),因为在这种情况下字符串不需要修改。
总结起来,trim()方法通过识别并移除字符串两端的空白字符,提供了字符串清理的功能,常用于文本处理前的预处理阶段。