CharSequence与String

问题描述:
      在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()方法来返回字符串的字符个数。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值