[每天一个知识点]6-Java语言-char和code point

本文深入探讨了Java中String类的内部存储机制,解释了Java如何通过UTF-16编码来表示Unicode字符,并且详细说明了charAt和codePointAt两个方法的区别及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.lang.String有2个方法

char charAt(int index)
Returns the  char value at the specified index.
int codePointAt(int index)
Returns the character (Unicode code point) at the specified index.

仔细看一下这2个方法的描述,正常来说应该会产生一个疑问,char和unicode code point有什么区别?(懂unicode的除外)

可能很多人都知道,java使用的是unicode,其实大部分人都分不清ucs和utf,准确地说java使用的是utf-16编码,而utf-16编码表达的是ucs。这个细节的不同,导致了一个普遍的误解:字符串在java中存储时每个字符占一个存储位置。实际上utf-16可以表达整个ucs-4字符集,只是BMP的字符恰好用1个16位整数存储(在这个区域里,中文文字只有20,927个),而其它平面的字符用2个16位整数存储而已。

也就是说,在某些少见的情况下,String.length()比字符串的长度要长。可以运行一下下面的代码找找感觉。

package test;

public class Test {
    public static String str = "\uD800\uDC00a汉";

    public static void main(String[] args) {
        System.out.printf("str.length(): %d\n", str.length());
        System.out.printf("str.codePointCount(0, 1): %d\n", str.codePointCount(0, 1));
        System.out.printf("str.codePointCount(0, 2): %d\n", str.codePointCount(0, 2));
        System.out.printf("str.codePointCount(0, 3): %d\n", str.codePointCount(0, 3));
        System.out.printf("str.codePointCount(0, str.length()): %d\n", str.codePointCount(0, str.length()));
        System.out.printf("str: %s\n", str);
        System.out.printf("str.charAt(0): %c\n", str.charAt(0));
        System.out.printf("str.codePointAt(0): %d\n", str.codePointAt(0));
        System.out.printf("str.codePointAt(1): %d\n", str.codePointAt(1));
    }
}

最后一个问题,知道这个有什么用?这个问题很难回答。按照80/20法则,解决20%的关键问题可以适用80%的场景。抽象一点讲,每个问题了解90%(大多数情况下是到不了这么高的),在16个问题叠加的情况下,能够完整解决的概率是0.1853,所以为什么我们觉得自己懂很多,还是写不好代码。在每个细节上多懂一点,有助于自己工作能轻松一点。但是,你永远无法预测的是,在你解决的每个问题中,是你知道的那十万个细节中的哪一个拯救了你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值