CharSequence是一个接口,表示一个char值的可读序列,此接口为多种char序列提供统一的、只读的通道。既然是接口,就不能通过new来进行赋值,只能通过以下方式赋值:
CharSequence cs = "ss";
该接口有4个常规方法和两个default方法(这两个暂时先不分析了)。
intlength();
char charAt(intindex);
CharSequence subSequence(int start, intend);
publicString toString();
*
* @return an IntStream of char values from thissequence
* @since 1.8
*/
public defaultIntStream chars() {
class CharIterator implementsPrimitiveIterator.OfInt {
int cur = 0;
public booleanhasNext() {
return cur <length();
}
public intnextInt() {
if(hasNext()) {
return charAt(cur++);
} else{
throw newNoSuchElementException();
}
}
@Override
public voidforEachRemaining(IntConsumer block) {
for (; cur < length(); cur++) {
block.accept(charAt(cur));
}
}
}
return StreamSupport.intStream(() ->Spliterators.spliterator(
newCharIterator(),
length(),
Spliterator.ORDERED),
Spliterator.SUBSIZED | Spliterator.SIZED |Spliterator.ORDERED,
false);
}
*
* @return an IntStream of Unicode code points from thissequence
* @since 1.8
*/
public defaultIntStream codePoints() {
class CodePointIterator implementsPrimitiveIterator.OfInt {
int cur = 0;
@Override
public voidforEachRemaining(IntConsumer block) {
final int length =length();
int i =cur;
try{
while (i <length) {
char c1 = charAt(i++);
if (!Character.isHighSurrogate(c1) || i >=length) {
block.accept(c1);
} else{
char c2 =charAt(i);
if(Character.isLowSurrogate(c2)) {
i++;
block.accept(Character.toCodePoint(c1, c2));
} else{
block.accept(c1);
}
}
}
} finally{
cur =i;
}
}
public booleanhasNext() {
return cur <length();
}
public intnextInt() {
final int length =length();
if (cur >=length) {
throw newNoSuchElementException();
}
char c1 = charAt(cur++);
if (Character.isHighSurrogate(c1) && cur <length) {
char c2 =charAt(cur);
if(Character.isLowSurrogate(c2)) {
cur++;
returnCharacter.toCodePoint(c1, c2);
}
}
returnc1;
}
}
return StreamSupport.intStream(() ->Spliterators.spliteratorUnknownSize(
newCodePointIterator(),
Spliterator.ORDERED),
Spliterator.ORDERED,
false);
}
测试:
packagecom.test;
public classTest {
@org.junit.Test
public voidtest(){
CharSequence cs = "welcome";
System.out.println("字符序列的长度:"+cs.length());
System.out.println("截取第一位字符(原字符序列不改变):"+cs.subSequence(0, 2));
System.out.println("字符序列转换成字符串表示:"+cs.toString());
System.out.println("返回第一个字符:"+cs.charAt(6));
}
}
结果: