问题描述:
在android平台上,有很多text values类型为CharSequence,如TextView等大部分控件的setText()方法,其参数都为CharSequence类型。
1.为什么要用CharSequence而不使用String,相对String而言,它的好处是什么?
2.两者的区别在哪里?
定义:
1.关于CharSequence
A CharSequence is a readable sequence of char values.
public char charAt(int index);
public int length();
//The length is the number of 16-bit chars int the sequence.
public CharSequence subSequence(int start, int end);
public String toString();
char在java中是2个字节,java采用unicode,2个字节(16位)来表示一个字符。
例如:
char ch = '我';
String str = "我";
byte[] bytes = str.getBytes(); //bytes[]数组长度为3
在Android平台下,得到的bytes数组长度为3,这就会很奇怪了,为什么这里要占用3个byte呢?3个byte一共是24位,那么 char ch怎么又能放得下24位呢,因为char是16位的啊??
原因:
byte[] bytes = str.getBytes();之后是3个字节,这里和前面的概念不一样。java是用unicode来表示字符,‘我’这个中文字符的unicode就是2个字节。String.getBytes(encoding)方法是获取指定编码的byte数组表示,通常gbk/gb2312是2个字节,utf-8是3个字节。如果不指定encoding则获取系统默认的encoding,在Android平台下默认编码为utf-8。
如:String s = "ab"; byte[] arr = s.getBytes(); 此时arr的长度为2
2.关于String
public final class String implements CharSequence
The String class represents character strings.
总结:
1.Strings are CharSequences.
CharSequence是个接口,String实现了CharSequence这个接口。
2.在Android下使用CharSequence,可以更好的进行扩展。你可以直接使用其他CharSequence对象,例如StringBuffer、StringBuilder等等。
额外知识:
1.
code point与code unit区别
代码点(Code Point):就是指Unicode中为字符分配的编号,一个字符只占一个代码点,例如我们说到字符"汉",它的代码点是U+6C49
代码单元(Code Unit):则是针对编码方法而言,它指的是编码方法中对一个字符编码以后所占的最小存储单元。例如UTF-8中,代码单元是一个字节,因为一个字符可以被编码为1个、2个或者3、4个字节;在UTF-16中,代码单元变成了2个字节(就是一个char),因为一个字符可以被编码位1个或2个char。
所以,一个字符仅仅对应一个code point,但却可能有多个code unit。
3.一个Code Point可能需要一个或者两个char来表示,因此不能直接使用CharSequence.length()方法来返回一个字符串到底有多少个汉字,而需要使用String.codePointCount()来判断
4.假设一个字符Unicode编号即code point为U+2F81A,要在程序中使用,需要用到
Character.toChars()方法:
public
static
char
[] toChars(
int
codePoint);
String s = String.valueOf(Character.toChars(0x2F81A));
System.out.println(s);
System.out.println(s.length());
System.out.println(s.codePointCount(0, 2));
打印结果如下:
? //该字符属于增补字符,打印不出来
2 //长度为2
1 //实际字符长度为1
可以看到,实际上只有一个字符,但因为该字符为增补字符,所以String.length()长度却为2,而codePointCount()却为1。因此验证了不能直接使用CharSequence.length()方法来返回字符串的字符个数。