稻花香

软件开发,喜欢读书,编程,禅修

String和CharSequence的区别

14 Jul 2018 » Java

StringCharSequence 的关系

String 继承于CharSequence,也就是说String也是CharSequence类型。

CharSequence是一个接口,它只包括length(), charAt(int index), subSequence(int start, int end)这几个API接口。除了String实现了CharSequence之外,StringBuffer和StringBuilder也实现了CharSequence接口。

需要说明的是,CharSequence就是字符序列,String, StringBuilderStringBuffer本质上都是通过字符数组实现的!

StringBuilderStringBuffer 的区别

StringBuilderStringBuffer都是可变的字符序列。

  • 它们都继承于AbstractStringBuilder,实现了CharSequence接口。

  • StringBuilder是非线程安全的,而StringBuffer是线程安全的。

它们之间的关系图如下:

img

CharSequence 详解

CharSequence就是一个可读的字符序列。对于不同类型的字符序列,这一接口都以统一且只读的方式去读取。一个字符值代表了BMP中的一个字符或者一个代理。(BMP是什么?BMP包含了现代大多数语言的字符集)

这一接口,并没有提炼出Object类定义的equals()方法和hashCode()方法的通用规范(但是像其他的接口,比如Map就有equals()方法和 hashCode()方法)。因此,使用任意的CharSequence实例作为set集合的元素或者map中的key,这种做法都是不合适的(因为CharSequence实例是没有equals方法和hashCode方法的,所以对应的实例的比较就取决于其继承的类或者其他实现的接口,那么两个被比较的类如果因为继承的类或者实现的接口 不同出现什么结果都是不可控的)。

CharSequence源码

package java.lang;

public interface CharSequence {

	// 返回字符序列的长度.
    // 长度是16bit的整数倍.(因为String类采用的是UTF-16编码,一个字符占用2个字节长度)
    int length();

    // 返回指定索引index位置处的字符,索引index的范围是[0,length()-1]
    char charAt(int index);
    
    // 返回一个新的字符序列,这个序列是原字符序列的子序列
    // 子序列的截取开始位置为:原序列中start的位置;截取结束位置为:原序列中(end-1)的位置
    // 因此子字符序列的长度为(end-start),所以如果传入参数start=end,则返回子序列为空序列
    CharSequence subSequence(int start, int end);

	// 返回字符序列的字符串形式,字符串中字符的顺序和字符序列保持一致,字符串的长度和字符序列一致
    public String toString();
}