小心String类的trim陷阱
最近在调试一段Java代码的时候,发生个奇怪的现象,在一个字符串的后面跟了一个不可见字符(acsii编码为0x13),对该字符串进行trim操作之后,发现该不可见字符消失了,在调试的过程中,没有认为会是因为trim造成的,但是在阅读了java的String类代码之后,才终于明白trim方法到底是怎么回事了。
?
?
public String trim() {int len = count;int st = 0;int off = offset; /* avoid getfield opcode */char[] val = value; /* avoid getfield opcode */while ((st < len) && (val[off + st] <= ' ')) { st++;}while ((st < len) && (val[off + len - 1] <= ' ')) { len--;}return ((st > 0) || (len < count)) ? substring(st, len) : this;}?注意其中的while判断部分,自己原来一直以为trim只是比较字符是否等于空格,但实际上trim函数会把所有包含空格在内的以及空格之前的所有不可见字符全部滤掉,因为空格的ascii码是0x20,这也就是为什么0x13字符经过trim之后就消失的原因了。