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个码点后的码点索引这里有我弄了比较久才理解的东西。什么叫做指定位置、码点索引?第二个方法是不是有病啊,我都知道初始码点索引和向后推的码点个数了,为什么还有这个方法来计算码点索引呢,直接做个加法不就好了?
看一下代码:
Strings="123𝕆";可以知道,它是4个字符,4个码点,字符长度是5,有5个代码单元。随便说一下,java中的字符长度length()就是代码单元长度,和我们平常理解的字符个数不是绝对等同的一个东西(虽然大多数是相同的值,于是乎变成了一个难以发现的坑)。
码点索引如下:
我们有字符“123𝕆”
1:码点索引0
2:码点索引1
3:码点索引2
𝕆:码点索引3和4
可以看到,第四个字符(码点)占用了两个码点索引。虽然书上是说叫做码点索引,但是理解起来跟寻常思维不一样,我个人将指定位置和码点索引理解为代码单元索引(也可能是原版英文译为中文时的错误)。可以说,java中任何涉及到字符串位置、索引(比如上面的码点索引)之类的东西,一律都视为代码单元索引。
其他一些常用的方法:
intcompareTo(Stringother):按照字典顺序,如果字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0;IntStreamcodePoints():将这个字符串的码点作为一个流返回。调用toArray将它们放在一个数组中。newString(int[]codePoints,intoffset,intcount):用数组中从offset开始的count个码点构造一个字符串。booleanempty()boleanblank():如果字符串为空或者由空格组成,返回true。booleanequals(Objectother):如果字符串和other相等,返回true。booleanequalsIgnoreCase(Stringother):如果字符串与other相等(忽略大小写),返回true。booleanstartsWith(Stringprefix)booleanendsWith(Stringsuffix):如果字符串以prefix开头或以suffix或结尾,则返回true。(PS:中文原版书籍中多了一个"或"字)intindexOf(Stringstr)intindexOf(Stringstr,intfromIndex):返回与字符串str或码点cp匹配的第一个子串的开始位置。从索引0或fromIndex开始匹配。如果在原始字符串中不存在str,则返回-1。intlastIndexOf(Stringstr)intlastIndexOf(Stringstr,intfromIndex)intlastIndexOf(Stringcp)intlastIndexOf(intcp)intlastIndexOf(intcp,intfromIndex):返回与字符串str或码点cp匹配的最后一个子串的开始位置。从原始字符串末尾或fromIndex开始匹配。intlength():返回字符串代码单元的个数。intcodePointCount(intstartIndex,intendIndex):返回startIndex和endIndex-1之间的码点个数。Stringreplace(CharSequenceoldString,CharSequencenewString):返回一个新字符串。这个字符串用newString代替原始字符串中所有的oldString。可以用String或StringBuilder对象作为CharSequence参数。Stringsubstring(intbeginIndex)Stringsubstring(intbeginIndex,intendIndex):返回一个新字符串。这个字符串包含原始字符串中从beginIndex到字符串末尾或endIndex-1的所有代码单元。StringtoLowerCase()StringtoUpperCase()返回一个新字符串。这个字符串将原始字符串中的大写字母改为小写字母,或者将原始字符串中的所有小写字母改成大写字母。Stringtrim()Stringstrip():返回一个新字符串。这个字符串将删除原始字符串头部和尾部小于等于U+0020的字符(trim)或空格(strip)。Stringjoin(CharSequencedelimiter,CharSequence...elements):返回一个新字符串,用给定的定界符连接所有元素。Stringrepeat(intcount):返回一个字符串,将当前字符串重复count次。注释:在API注释中,有一些CharSequence类型的参数。这是一种接口类型,所有字符串都属于这个接口。
欢迎点赞,收藏,转发。个人网站博客地址:朗朗繁星的博客