前提知识
- 字符串底层是char数组 1char=2Byte=16bit
- 字符是根据不同类型的编码映射的,类似于字典.Java默认Unicode编码
- 在Java中你写’a’和(char)97 是一样的,不懂看看编码表
代码+原理 讲解
- 示例代码
// example String a ="a"; String b =" 半角空格(普通的) 半角空格但不换行"+(char)160; a.concat(b); // 注意 trim 是不能去除后面那个空格 b.trim(); // 转为char数组 或者直接debug 均可看到 底层结构 char[] chars = b.toCharArray(); System.out.println(chars); System.out.println(a); System.out.println(b);
debug截图:
分析:在trim之后我们发现 1 处已经没有了,2 处仍旧存在,但是是我们手打的’ ‘,3 处是我们定义的(char)160,很明显.我们trim的两边的空格左边已经完成了,右边失败了.
. . . . . 但是我们已经找到了这两个空格是不同的. 他们分别是 (char)32 和(char)160;同时得出trim也是替换的(char)32.看源码截图:
注意:不要自作聪明 用replaceAll(’ ‘); 你这不是一样的只替换掉数组中的(char)32位置吗?要使用replaceAll((char(160)+’’));这样就行了字符串中的空格trim不起作用,一步debug教你直观的看到why 字符串中的空格trim不起作用,一步debug教你直观的看到why -
额外的
. . . . 你还可以看到汉字’半’他是一个char.但是UNICODE编码.
- 附加常用特殊字符参考
/**普通的英文半角空格Unicode编码*/
private static final int SPACE_32 = 32;
/**中文全角空格Unicode编码(一个中文宽度)*/
private static final int SPACE_12288 = 12288;
/**普通的英文半角空格但不换行Unicode编码(== ==   == no-break space)*/
private static final int SPACE_160 = 160;
/**半个中文宽度(==   == en空格)*/
private static final int SPACE_8194 = 8194;
/**一个中文宽度(==   == em空格)*/
private static final int SPACE_8195 = 8195;
/**四分之一中文宽度(四分之一em空格)*/
private static final int SPACE_8197 = 8197;