概述

字符序列接口,封装了对字符序列的一些操作(包括转换为流的操作)
java.lang.CharSequence接口是一个可读的字符序列。此接口为不同类型的字符序列提供了一种统一且只读的访问方式。如String、StringBuilder、CharArray等都实现了该接口。
CharSequence接口没refine Object类中定义的equals和hashCode方法的通用约定,因此对于两个实现了该接口的对象而言,在进行对比是,通常其结果也是未定义的。同时,使用任意的CharSequence实例作为set集合的元素或者map中的key是不合适的,因为实现该接口的每个对象可以由不同的类来实现,导致无法保证每个类都有和其他类实例有等价的测试能力。

length()方法

返回字符序列的长度。由于String类采用的是UTF-16编码,因此该方法返回的值肯定是16bit的整数倍。

  1. int length();

charAt(int)方法

返回索引index处的字符。

  1. char charAt(int index);

subSequence(int, int)方法

返回该字符序列的子序列。子序列包含原序列的第start个位置的字符,但不含第end个位置的字符。另外,如果入参start==end,则返回空序列。

  1. CharSequence subSequence(int start, int end);

toString()方法

返回由这个字符序列组成的字符串

  1. String toString();

compare()方法

按字典顺序比较两个字符序列,不重要

  1. static int compare(CharSequence cs1, CharSequence cs2) {
  2. // 两个字符序列不为空且相等的场合
  3. if(Objects.requireNonNull(cs1) == Objects.requireNonNull(cs2)) {
  4. return 0;
  5. }
  6. if(cs1.getClass() == cs2.getClass() && cs1 instanceof Comparable) {
  7. return ((Comparable<Object>) cs1).compareTo(cs2);
  8. }
  9. for(int i = 0, len = Math.min(cs1.length(), cs2.length()); i<len; i++) {
  10. char a = cs1.charAt(i);
  11. char b = cs2.charAt(i);
  12. if(a != b) {
  13. return a - b;
  14. }
  15. }
  16. return cs1.length() - cs2.length();
  17. }

chars()方法

将当前char序列转为流序列,序列中每个元素是char

  1. default IntStream chars() {
  2. // 元素类型是int类型(包括byte,short,char)的Iterator
  3. class CharIterator implements PrimitiveIterator.OfInt {
  4. int cur = 0;
  5. public boolean hasNext() {
  6. return cur<length();
  7. }
  8. public int nextInt() {
  9. // 元素有的场合
  10. if(hasNext()) {
  11. // 返回索引index处的字符
  12. return charAt(cur++);
  13. } else {
  14. throw new NoSuchElementException();
  15. }
  16. }
  17. @Override
  18. public void forEachRemaining(IntConsumer block) {
  19. // 遍历所有元素
  20. for(; cur<length(); cur++) {
  21. // 将所有元素以char类型消费掉,后面就无法调用
  22. block.accept(charAt(cur));
  23. }
  24. }
  25. }
  26. // 返回用于创建和操作流
  27. return StreamSupport.intStream(
  28. () -> Spliterators.spliterator(new CharIterator(), length(), Spliterator.ORDERED),
  29. Spliterator.SUBSIZED | Spliterator.SIZED | Spliterator.ORDERED,
  30. false
  31. );
  32. }

codePoints()方法

将当前Unicode符号序列转为流序列,序列中每个元素是Unicode符号

  1. default IntStream codePoints() {
  2. class CodePointIterator implements PrimitiveIterator.OfInt {
  3. int cur = 0;
  4. public boolean hasNext() {
  5. return cur<length();
  6. }
  7. public int nextInt() {
  8. final int length = length();
  9. if(cur >= length) {
  10. throw new NoSuchElementException();
  11. }
  12. char c1 = charAt(cur++);
  13. // Unicode高代理区的场合
  14. if(Character.isHighSurrogate(c1) && cur<length) {
  15. char c2 = charAt(cur);
  16. // Unicode低代理区的场合
  17. if(Character.isLowSurrogate(c2)) {
  18. cur++;
  19. // 返回值是Unicode符号编码值
  20. return Character.toCodePoint(c1, c2);
  21. }
  22. }
  23. return c1;
  24. }
  25. @Override
  26. public void forEachRemaining(IntConsumer block) {
  27. final int length = length();
  28. int i = cur;
  29. try {
  30. while(i<length) {
  31. char c1 = charAt(i++);
  32. // Unicode高代理区的场合
  33. if(!Character.isHighSurrogate(c1) || i >= length) {
  34. block.accept(c1);
  35. } else {
  36. char c2 = charAt(i);
  37. // Unicode低代理区的场合
  38. if(Character.isLowSurrogate(c2)) {
  39. i++;
  40. block.accept(Character.toCodePoint(c1, c2));
  41. } else {
  42. block.accept(c1);
  43. }
  44. }
  45. }
  46. } finally {
  47. cur = i;
  48. }
  49. }
  50. }
  51. return StreamSupport.intStream(
  52. () -> Spliterators.spliteratorUnknownSize(new CodePointIterator(), Spliterator.ORDERED),
  53. Spliterator.ORDERED,
  54. false
  55. );
  56. }