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非静态成员变量之死循环(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Spring AOP日志框架实现过程图解

    Spring AOP日志框架实现过程图解

    这篇文章主要介绍了Spring AOP日志框架实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • RabbitMQ下载与安装教程

    RabbitMQ下载与安装教程

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),这篇文章给大家介绍RabbitMQ下载与安装教程,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • SpringBoot中的ApplicationListener事件监听器使用详解

    SpringBoot中的ApplicationListener事件监听器使用详解

    这篇文章主要介绍了SpringBoot中的ApplicationListener事件监听器使用详解,ApplicationListener是应用程序的事件监听器,继承自java.util.EventListener标准接口,采用观察者设计模式,需要的朋友可以参考下
    2023-11-11
  • Java date format时间格式化操作示例

    Java date format时间格式化操作示例

    这篇文章主要介绍了Java date format时间格式化操作,结合具体实例形式分析了java针对日期时间进行格式化操作的相关实现技巧,需要的朋友可以参考下
    2017-03-03
  • SpringAOP实现登录验证的操作代码

    SpringAOP实现登录验证的操作代码

    这篇文章主要介绍了SpringAOP实现登录验证功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • 使用Spring Boot进行单元测试详情

    使用Spring Boot进行单元测试详情

    这篇文章主要介绍了使用Spring Boot进行单元测试详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Springboot项目的Mapper中增加一个新的sql语句

    Springboot项目的Mapper中增加一个新的sql语句

    本文主要介绍了Springboot项目的Mapper中增加一个新的sql语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • java内存管理关系及内存泄露的原理分析

    java内存管理关系及内存泄露的原理分析

    这篇文章主要介绍了java内存管理关系及内存泄露的原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java实现鼠标拖拽移动界面组件

    Java实现鼠标拖拽移动界面组件

    在Java中,Frame或者JFrame自身已经实现了鼠标拖拽标题栏移动窗口的功能。但是Jframe的样式实在无法令人满意,那你又该怎么实现鼠标拖拽移动窗口的目的呢?今天我们来探讨下
    2014-09-09

最新评论