Java String.length( ) 和 String.codePointCount( )区别 String.charAt( )和String.codePointAt( )区别

java String类提供以下两个方法获取字符串长度:

int length( )
int codePointCount(int beginIndex, int endIndex)

提供以下两个方法索引字符串中单个字符:

char charAt(int index)
int codePointAt(int index)

理解这些方法之间的区别,首先需要学习一下unicode和UTF-16:

1.unicode

unicode 是目前主流的字符编码方式,对世界上几乎所有常用字符都进行了编码,统一了字符编码方式。unicode 码值范围是0~0x10FFFF, 可见最高会占用6字节表示字符值。常用字符位于0~0xFFFF范围内。每个字符对应的unicode码值称为码点(code point)。

2.UTF-16

使用unicode编码的文本,需要用六个字节保存每个字符,因为字符的码点较大时可能会占用6字节的存储空间。但是常用字符的码点位于0~0xFFFF,只需要使用2个字节就可以表示,高4字节值全为0. 所以使用6字节保存常见字符的码点会非常浪费空间。于是UTF-16(还用常见的UTF-8等)编码被设计出来用于节约空间。字符的码点用UTF-16编码后再存入存储器当中。下面介绍UTF-16如何编码字符的码点,即0-0x10FFFF

  • 对于0~0xFFFF的码点,UTF-16使用对应的2字节的无符号整数表示,这两个字节在UTF-16被称作代码单元(code unit)。
  • 0x10000~0x10FFFF的码点,UTF-16使用4个字节表示,即使用一对代码单元。具体的编码方式是:假设某字符的码点是u(u大于等于0x10000),令u’=0x10000,然后将u’转换为二进制形式即 xxxx xxxx xxyy yyyy yyyy,带入到 1101 10xx xxxx xxxx 1101 11yy yyyy yyyy当中,所得4字节数即为码点u的UTF-16编码值,即一对代码单元。
3.Java char类型

java支持unicode, 并使用UTF-16保存码点,char类型对应双字节的代码单元,若保存特殊字符(其码点大于等于0x10000),Java会使用两个char 类型变量保存。

4.区别

根据以上知识点,解释方法之间区别:

  • String.length() 返回字符串所使用的代码单元个数,或者说返回字符串占用的char类型数据个数。String.codePointCount() 则返回字符串的码点个数,一个字符对应一个码点,所以该方法可以真正返回字符串当中的字符个数。length()方法和codePointCount()方法在某些情况下返回值相等,即字符串当中字符都是常见字符时(码点小于等于0xFFFF).
  • char String.charAt(int index)从该方法返回值类型可以发现其返回char型数据,即代码单元,则一个特殊字符有一对代码单元,则需要调用两次该方法才能获取其所有char值。int String.codePointAt(int index) 返回指定索引处的字符码点,任何一个字符只有一个码点。
    看一下测试代码:
public class UnicodeTest {
	public static void main(String[] args) {
		String s = "\uD835\uDD6B"; // 该字符串只有一个特殊字符?,使用其utf-16值描述该字符
		System.out.println(s);
		System.out.println("length() return: "+s.length());
		System.out.println("codePointCount() return:" +s.codePointCount(0,s.length()));
		int cp=s.codePointAt(0);
		System.out.println("codePoint: 0x"+Integer.toHexString(cp));
		int v1=s.charAt(0);
		System.out.println("first code uint: 0x"+Integer.toHexString(v1));
		int v2=s.charAt(1);
		System.out.println("second code uint: 0x"+Integer.toHexString(v2));
	}

运行结果如下:
运行结果
可以看到只有一个特殊字符的字符串s的length()返回值为2,codePointCount返回值为1,通过codePointAt()方法过去了该字符对应码点,两次调用charAt()方法返回了该字符所有char 数据。

5. 总结

在知道unicode和utf-16相关概念后,仔细查看方法对应英文JAVAdoc文档,就可以理解方法的区别和使用场景。

如果对你有帮助,请点个赞,谢谢!

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值