java中charAt()方法的使用及说明

 更新时间:2023年07月28日 09:23:37   作者:骑着蜗牛@you  
这篇文章主要介绍了java中charAt()方法的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java charAt()方法的使用

描述

java.lang.String.charAt() 方法返回指定索引处的char值。

索引范围是从0到length() - 1。

对于数组索引,序列的第一个char值是在索引为0,索引1,依此类推

声明  

以下是声明java.lang.String.charAt()方法

public char charAt(int index)

参数

index -- 这是该指数的char值

返回值  

此方法返回这个字符串的指定索引处的char值。第一个char值的索引为0.

异常

IndexOutOfBoundsException -- 如果index参数为负或不小于该字符串的长度.

实例      

public class Test {
    public static void main(String[] args) {
        String s ="abc";
        System.out.println(s.charAt(1));
    }
}

运行结果是:

b

java使用charAt(),length()可能会遇到的乱码问题

charAt()和length()都是经常使用到的命令,这两个命令在遇到某些特殊字符的时候会出现一些问题。

比如:

public class Demo{
    public static void main(String args[]){
        String s = "👲";
        char c = s.charAt(0);
        System.out.println(s.length());
        System.out.println(c);
    }
}

可以发现这个特殊字符(或者叫表情符号会好一些)的长度居然是2,而且我把他作为字符输出的时候居然输出了一个问号,这是为什么?

原因是

length()方法是跟据UTF-16的代码单元数量来计算字符串的长度的,在UTF-16中常用字符用一个代码单元就可以表示,而有些字符则需要两个代码单元表示,比如"👲",所以我们才会看到这个字符串竟然占据了2个长度。

那为什么变量c会输出问号呢?,没错,charAt()方法也是根据代码单元来获取字符的,变量c只获取了👲的第一个代码单元所以编译器并不能识别。

这在遍历字符串的时候可能会出现很严重的问题:

public class Demo {
    public static void main(String[] args) {
        String str = "👲🎁🔜😀😁🤣";
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            System.out.println(c);
        }
    }
}

另外,当我把println换成print再输出后却得到了正确的字符。

可以看出当两个特定的代码单元组合后编译器会把它当作一个字符看待。

解决方法

最好的解决办法就是不使用charAt()和length()方法(除非你能保证接收的字符串都是常用的字符)。

首先说length()方法取字符数量错误的问题,要解决这个问题先要了解一个术语,叫“码点”,有人也叫“代码点”,码点指的是一个编码表中的某个字符所对应的代码值,所以码点的数量才是字符串中字符的数量。

方法一:要想得到码点数量可以用codePointCount(0,str.length())方法,然后再用offsetByCodePoints(0,i)获取码点的索引值index,根据index用codePointAt(index)方法得出码点值,最后用Character.toString(cp)取出字符(返回的其实是字符串,要想真正的取出char类型的值是不可能的)。

方法二:用codePoints()生成一个流,再用toArray()使其返回一个码点值的数组,然后根据这个数组使用Character.toString(codePoints(i))方法循环输出。

附完整代码:

public class Demo {
    public static void main(String[] args) {
        String str = "👲🎁🔜😀😁🤣";
        //方法一
        for (int i = 0; i < str.codePointCount(0,str.length()); i++) {
            int index = str.offsetByCodePoints(0,i);
            int cp = str.codePointAt(index);
            System.out.println(Character.toString(cp));
        }
        System.out.println("-------------------------------------");
        //方法二
        int[] codePoints = str.codePoints().toArray();
        for (int i = 0; i < codePoints.length; i++) {
            System.out.println(Character.toString(codePoints[i]));
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java的回调机制实例详解

    Java的回调机制实例详解

    这篇文章主要介绍了Java的回调机制,结合实例形式详细分析了java回调机制相关原理、用法及操作注意事项,需要的朋友可以参考下
    2019-08-08
  • Spring拦截器之HandlerInterceptor使用方式

    Spring拦截器之HandlerInterceptor使用方式

    这篇文章主要介绍了Spring拦截器之HandlerInterceptor使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • GSON实现Java对象的JSON序列化与反序列化的实例教程

    GSON实现Java对象的JSON序列化与反序列化的实例教程

    GSON是Google开发并开源的一个Java的JSON转换库,这里我们将来讲解GSON实现Java对象的JSON序列化与反序列化的实例教程,需要的朋友可以参考下
    2016-06-06
  • 新手学习Java对Redis简单操作

    新手学习Java对Redis简单操作

    这篇文章主要介绍了新手学习Java对Redis简单操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 如何获取java类中的属性注释

    如何获取java类中的属性注释

    在开发中,有时需要获取Java类的属性注释,尤其是当JPA生成的表缺少注释时,可以通过jdk自带的tools.jar工具包来实现,方法类似于生成javadoc文档,需要在pom.xml文件中导入tools.jar的依赖,该jar文件一般位于JAVA_HOME/lib目录下
    2024-09-09
  • Spring Boot整合持久层之JPA多数据源

    Spring Boot整合持久层之JPA多数据源

    JPA(Java Persistence API)Java 持久化 API,是 Java 持久化的标准规范,Hibernate 是持久化规范的技术实现,而 Spring Data JPA 是在 Hibernate 基础上封装的一款框架
    2022-08-08
  • SpringBoot之如何搭建SpringBoot+Maven项目

    SpringBoot之如何搭建SpringBoot+Maven项目

    这篇文章主要介绍了SpringBoot之如何搭建SpringBoot+Maven项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 实例解析JAVA中代码的加载顺序

    实例解析JAVA中代码的加载顺序

    这篇文章主要介绍了举例说明Java中代码块的执行顺序,需要的朋友可以参考下
    2017-04-04
  • 关于spring中aop的注解实现方法实例详解

    关于spring中aop的注解实现方法实例详解

    这篇文章主要给大家介绍了关于spring中aop的注解实现方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起看看吧。
    2017-08-08
  • Java反射获取class对象方式解析

    Java反射获取class对象方式解析

    这篇文章主要介绍了Java反射获取class对象方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论