遍历字符串

简介: 首先必须要知道,Java字符串不是char数组而是Unicode序列,这是很多C/C++程序员转Java时会遇到的坑 为什么Java要用Unicode编码机制来定义String中的字符单元呢?...

首先必须要知道,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));
        }
目录
相关文章
字符串转数组、数组转字符串、给第一个单词色值
字符串转数组、数组转字符串、给第一个单词色值
|
JavaScript 前端开发 Java
数组转字符串( 字符串转数组~
数组转字符串可以使用不同的方法,具体取决于编程语言和上下文环境。以下是一些通用的示例:
常用的数组(字符串)方法有哪些?(三)
some:判断数组中有没有符合条件的元素,一个符合的都没有返回false,有一个就是true。
常用的数组(字符串)方法有哪些?(二)
concat:合并数组或者字符串,concat在项目中用的还是比较多的,最经典的就是一个表格数据是有两个或者三个数组组成的时候会用到,watch监听数组和concat结合使用。下期做一个例子。
|
JavaScript
常用的数组(字符串)方法有哪些?(一)
1.pop:末位删除,即删除数组的最后一项,返回值是被删除项。 2.shift:首位删除,即删除数组的第一项,返回值是被删除项。 3.splice:指定下标删除元素,返回被删除的元素。第一个参数是从下标几开始删除,第二个参数是删除几个,第三个参数是要插入的元素。splice方法是会改变原数组的。删除功能用的比较多,我个人更喜欢用filter来变相实现删除,splice是会改变原数组的,而filter不会
|
C++ 容器
【C++】字符串遍历的三种方式
【C++】字符串遍历的三种方式
逆序字符串 和 字符串的逆序输出 的区别~
逆序字符串 和 字符串的逆序输出 的区别~
112 0
逆序遍历List集合
逆序遍历List集合
65 0
|
C语言 C++
将一个字符串str的内容颠倒(逆序)过来,并输出
将一个字符串str的内容颠倒(逆序)过来,并输出
307 0
将一个字符串str的内容颠倒(逆序)过来,并输出
|
人工智能 Java
用java实现遍历一个字符串中的每一个字母
用java实现遍历一个字符串中的每一个字母
217 0
下一篇
无影云桌面