遍历字符串

首先必须要知道,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));
        }
上一篇:更快的Maven构建工具mvnd和Gradle哪个性能更好?(4)


下一篇:替换iframe的内容