IE盒子

搜索
查看: 123|回复: 1

关于java.lang.String常用方法全解析以及代码单元、码点等的 ...

[复制链接]

5

主题

14

帖子

31

积分

新手上路

Rank: 1

积分
31
发表于 2023-1-7 21:26:36 | 显示全部楼层 |阅读模式
参考书籍《java核心技术卷1》 String类的使用频率非常高,几乎所有的String API都很有用。 代码单元:
定义:字符编码的最小存储单位
char charAt(int index):返回指定位置的代码单元。通常来说,在java中,字母以及一些常用的字符都是一个代码单元的。java在内存中的字符编码是utf16,而在源码文件和class文件中,编码是utf8。在utf8中,一个汉字占3个字节(2万多汉字)或4个字节(5万多汉字),而utf8是网络传输中最通用的字符编码。在utf16中,一个汉字占2个字节,少数汉字占用4个字节。
uft8是可变编码,占用1~6字节。一个字节就是一个代码单元。 uft16也是可变编码,占用2个或者4个字节。两个字节就是一个代码单元。
汉字数量太多,往往一个代码单元表示不了。 我们只考虑java在运行时对汉字的编码,因为运行时才是关键,即认识到java运行时的编码(也叫作内码)采用的是utf16编码。一个代码单元就是2个字节(16位)。有些生僻字符(比如一些生僻汉字)占用2个代码单元(32位),即4个字节。
码点:
定义:一个字符对应的编码
可以简单的理解为字符。即一个码点就是一个字符。根据上面所说的,一个码点可以是1个或2个代码单元组成。2个代码单元组成的字符也称作辅助字符
int codePointAt(int index):返回指定位置的开始的码点。
    int offsetByCodePoints(int startIndex, int cpCount):返回从startIndex码点开始,cpCount个码点后的码点索引这里有我弄了比较久才理解的东西。什么叫做指定位置、码点索引?第二个方法是不是有病啊,我都知道初始码点索引和向后推的码点个数了,为什么还有这个方法来计算码点索引呢,直接做个加法不就好了? 看一下代码:


可以知道,它是4个字符,4个码点,字符长度是5,有5个代码单元。随便说一下,java中的字符长度length()就是代码单元长度,和我们平常理解的字符个数不是绝对等同的一个东西(虽然大多数是相同的值,于是乎变成了一个难以发现的坑)。
码点索引如下:
第一个字符1:码点索引0
第二个字符2:码点索引1
第三个字符3:码点索引2
第四个字符(一个特殊字符,知乎显示不出来):码点索引3和4
可以看到,第四个字符(码点)占用了两个码点索引。虽然书上是说叫做码点索引,但是理解起来跟寻常思维不一样,我个人将指定位置和码点索引理解为代码单元索引(也可能是原版英文译为中文时的错误)。可以说,java中任何涉及到字符串位置、索引(比如上面的码点索引)之类的东西,一律都视为代码单元索引
其他一些方法:
int compareTo(String other):按照字典顺序,如果字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0;
IntStream codePoints():将这个字符串的码点作为一个流返回。调用toArray将它们放在一个数组中。
new String(int[] codePoints, int offset, int count):用数组中从offset开始的count个码点构造一个字符串。
boolean empty()
bolean blank():如果字符串为空或者由空格组成,返回true。
boolean equals(Object other):如果字符串和other相等,返回true。
boolean equalsIgnoreCase(String other):如果字符串与other相等(忽略大小写),返回true。
boolean startsWith(String prefix)
boolean endsWith(String suffix):如果字符串以prefix开头或以suffix或结尾,则返回true。(PS:中文原版书籍中多了一个"或"字)
int indexOf(String str)
int indexOf(String str, int fromIndex):返回与字符串str或码点cp匹配的第一个子串的开始位置。从索引0或fromIndex开始匹配。如果在原始字符串中不存在str,则返回-1。
int lastIndexOf(String str)
int lastIndexOf(String str, int fromIndex)
int lastIndexOf(String cp)
int lastIndexOf(int cp)
int lastIndexOf(int cp, int fromIndex):返回与字符串str或码点cp匹配的最后一个子串的开始位置。从原始字符串末尾或fromIndex开始匹配。
int length():返回字符串代码单元的个数。
int codePointCount(int startIndex, int endIndex):返回startIndex和endIndex-1之间的码点个数。
String replace(CharSequence oldString, CharSequence newString):返回一个新字符串。这个字符串用newString代替原始字符串中所有的oldString。可以用String或StringBuilder对象作为CharSequence参数。
String substring(int beginIndex)
String substring(int beginIndex, int endIndex):返回一个新字符串。这个字符串包含原始字符串中从beginIndex到字符串末尾或endIndex-1的所有代码单元。
String toLowerCase()
String toUpperCase()
返回一个新字符串。这个字符串将原始字符串中的大写字母改为小写字母,或者将原始字符串中的所有小写字母改成大写字母。
String trim()
String strip():返回一个新字符串。这个字符串将删除原始字符串头部和尾部小于等于U+0020的字符(trim)或空格(strip)。
String join(CharSequence delimiter, CharSequence... elements):返回一个新字符串,用给定的定界符连接所有元素。
String repeat(int count):返回一个字符串,将当前字符串重复count次。

注释:在API注释中,有一些CharSequence类型的参数。这是一种接口类型,所有字符串都属于这个接口。​    欢迎点赞,收藏,转发。个人网站博客地址:朗朗繁星的博客
回复

使用道具 举报

1

主题

8

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2025-5-19 02:09:19 | 显示全部楼层
路过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表