首先必须要知道,Java字符串不是char数组而是Unicode序列,这是很多C/C++程序员转Java时会遇到的坑
为什么Java要用Unicode编码机制来定义String中的字符单元呢?
这就与Java强大的字符兼容性有关了,Java这正是因为采用了Unicode才可以兼容多国语言,或是各种奇怪的符号
所有常用的字符在Unicode中用一个代码单元表示,而一些特殊的字符则需要两个代码单元才能表示,而char类型只能描述一个代码单元,因此如果不注意就会出现字符转换的问题
码点(code point)表示Unicode机制下的每一个字符单元,因此在对String的每一个字符元操作需要使用codepoint而不是像C/C++中的数组下标
好了,言归正传,我们来看看怎么在Java中遍历字符串
for( int i = 0; i < str.length(); i++){ System.out.println(str[i]); }
请新转Java的朋友们看看,这个对吗?
当然不对了!String不是Array! 这直接就是语法错误,正确如下:
for( int i = 0; i < str.length(); i++){
System.out.println(str.charAt(i));
}
这个就对了,但是你觉得怎么样?好吗?
当然不好了!不都说了要用codepoint吗?!!!
for( int i = 0; i < str.length(); i++){
System.out.println(str.charAt(i));
}
int[] codePoints = str.codePoints().toArray();
for( int i = 0; i < codePoints.length; i++ ){
System.out.printf("%c\n", codePoints[i]);
}
这样就对了!codePoints用来记录String中的每一个码点
这里要注意一下,你可能会这样写:
for( int i = 0; i < str.length(); i++){
System.out.println(str.charAt(i));
}
for( int i = 0; i < str.length(); i++){
System.out.printf("%c\n", str.codePointAt(i));
}
但是这样也是不安全的,因为 str.length返回的是字符串中 代码单元的数量 (特殊字符占据两个代码单元)
因此想要得到实际长度还得是码点数量
int cpCount = str.codePointCount(0, greeting.length());//参数表示从头到尾统计
如果你有更好的方法欢迎留言!
for( int i = 0; i < str.length(); i++){
System.out.println(str.charAt(i));
}