Java CharSequence 接口
最后修改时间:2025 年 4 月 13 日
java.lang.CharSequence
接口表示字符值的可读序列,提供文本数据的一致且不可变的视图。它作为各种字符序列类型的抽象,允许统一访问其内容。此接口由多个类实现,包括 String
、StringBuilder
和 StringBuffer
,每个类都提供不同的功能来处理和操作文本。
CharSequence
在 Java 1.4 中引入,旨在统一不同字符序列类型的操作。它提供了几种方法,例如
length()
- 返回序列中的字符数。charAt(int index)
- 检索指定索引处的字符。subSequence(int start, int end)
- 返回字符序列的一部分。toString()
- 将序列转换为String
表示形式。
由于 CharSequence
是一个接口,它不提供具体的实现,而是定义一个实现类必须遵循的约定。例如,String
类表示不可变的字符序列,而 StringBuilder
和 StringBuffer
允许具有不同线程行为的可变字符串操作。
许多 Java API 接受 CharSequence
作为参数,从而在使用不同类型的字符序列时实现灵活性。这种抽象使得处理文本更容易,而无需局限于特定的底层实现。
CharSequence 接口方法
CharSequence
接口定义了几个用于检查字符的方法。这些方法必须由所有实现该接口的类来实现。主要方法包括 length
、charAt
、subSequence
和 toString
。
CharSequence 的基本用法
此示例演示了 CharSequence
与不同实现的基本用法。 我们展示了如何将接口方法与 String
、StringBuilder
和 StringBuffer
一起使用。
void main() { // Different CharSequence implementations CharSequence str = "Hello World"; CharSequence sb = new StringBuilder("Java Programming"); CharSequence sbf = new StringBuffer("CharSequence Demo"); // Common operations System.out.println("String length: " + str.length()); System.out.println("5th char in StringBuilder: " + sb.charAt(4)); System.out.println("Subsequence of StringBuffer: " + sbf.subSequence(0, 11)); // toString() usage String s = str.toString(); System.out.println("Converted to String: " + s); }
此示例显示了 CharSequence
如何为不同的字符序列类型提供一个公共接口。 无论底层实现如何,我们都可以调用相同的方法。 toString
方法在需要时将任何 CharSequence
转换为 String
。
CharSequence 与 String
字符串是最常见的 CharSequence
实现。 此示例显示了通过 CharSequence
接口的特定 String 操作。
void processSequence(CharSequence seq) { System.out.println("Processing sequence: " + seq); System.out.println("Length: " + seq.length()); System.out.println("First char: " + seq.charAt(0)); System.out.println("Last char: " + seq.charAt(seq.length() - 1)); } void main() { String text = "Programming in Java"; processSequence(text); processSequence(text.subSequence(0, 11)); }
在这里,我们演示了 String 如何作为 CharSequence
工作。 processSequence 方法接受任何 CharSequence
,允许它与完整的 String 及其子序列一起使用。 这显示了面向接口编程的灵活性。
CharSequence 与 StringBuilder
StringBuilder
是一个可变的 CharSequence
实现。 此示例显示了如何在保持可变性的同时,通过 CharSequence
接口使用 StringBuilder
。
void main() { StringBuilder sb = new StringBuilder("Initial Value"); CharSequence cs = sb; System.out.println("Original: " + cs); System.out.println("Length: " + cs.length()); System.out.println("Char at 3: " + cs.charAt(3)); // Mutate the underlying StringBuilder sb.append(" Appended"); System.out.println("After mutation: " + cs); // Create subsequence CharSequence sub = cs.subSequence(8, 13); System.out.println("Subsequence: " + sub); }
此示例演示了虽然 CharSequence
本身是只读的,但底层 StringBuilder
仍然是可变的。 通过 CharSequence
引用,可以观察到对 StringBuilder
的更改。 子序列操作会创建原始序列的部分的新 CharSequence
视图。
正则表达式中的 CharSequence
Java 的正则表达式 API 广泛使用 CharSequence
。 此示例显示了使用不同 CharSequence
实现的模式匹配。
void main() { Pattern pattern = Pattern.compile("\\d{3}-\\d{2}-\\d{4}"); CharSequence[] inputs = { "123-45-6789", // String new StringBuilder("987-65-4321"), new StringBuffer("Invalid-12-3456"), "Another invalid 12-34-5678" }; for (CharSequence input : inputs) { Matcher matcher = pattern.matcher(input); System.out.println(input + ": " + (matcher.matches() ? "Valid" : "Invalid")); } }
此示例演示了 Java 的 regex API 如何接受任何 CharSequence
。 我们针对社会安全号码模式测试不同的实现。 Pattern
和 Matcher
类适用于所有 CharSequence
类型,显示了接口在 API 设计中的实用性。
自定义 CharSequence 实现
此示例显示了如何创建自定义 CharSequence
实现。 我们将构建一个简单的序列,该序列反转另一个 CharSequence
。
public class ReverseCharSequence implements CharSequence { private final CharSequence original; public ReverseCharSequence(CharSequence original) { this.original = original; } @Override public int length() { return original.length(); } @Override public char charAt(int index) { return original.charAt(original.length() - 1 - index); } @Override public CharSequence subSequence(int start, int end) { return new ReverseCharSequence( original.subSequence(original.length() - end, original.length() - start)); } @Override public String toString() { StringBuilder sb = new StringBuilder(length()); for (int i = 0; i < length(); i++) { sb.append(charAt(i)); } return sb.toString(); } } void main() { CharSequence original = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; CharSequence reversed = new ReverseCharSequence(original); System.out.println("Original: " + original); System.out.println("Reversed: " + reversed); System.out.println("5th char: " + reversed.charAt(4)); System.out.println("Subseq(5-10): " + reversed.subSequence(5, 10)); }
此示例演示了创建自定义 CharSequence
,该序列反转另一个序列。 ReverseCharSequence 类实现所有必需的方法,提供原始序列的反向顺序视图。 这显示了如何使用 CharSequence
来创建专门的序列视图。
CharSequence 性能注意事项
此示例比较了不同 CharSequence
实现的常见操作的性能特征。
public static void measurePerformance(CharSequence seq, String type) { final int ITERATIONS = 1000000; // Measure charAt performance long start = System.nanoTime(); for (int i = 0; i < ITERATIONS; i++) { seq.charAt(i % seq.length()); } long duration = System.nanoTime() - start; System.out.printf("%s charAt: %d ns%n", type, duration/ITERATIONS); // Measure subSequence performance start = System.nanoTime(); for (int i = 0; i < ITERATIONS; i++) { seq.subSequence(0, seq.length() / 2); } duration = System.nanoTime() - start; System.out.printf("%s subSequence: %d ns%n", type, duration/ITERATIONS); } void main() { CharSequence str = "PerformanceTestString"; CharSequence sb = new StringBuilder("PerformanceTestString"); CharSequence sbf = new StringBuffer("PerformanceTestString"); measurePerformance(str, "String"); measurePerformance(sb, "StringBuilder"); measurePerformance(sbf, "StringBuffer"); }
此示例测量了跨不同实现的 CharSequence
基本操作的性能。 String 通常提供最快的读取操作,而 StringBuilder
和 StringBuffer 可能具有不同的性能特征。 结果可能因 JVM 实现和版本而异。
来源
在本文中,我们通过实际示例介绍了 Java CharSequence
接口。 理解 CharSequence
对于编写灵活的 API 非常有价值,这些 API 可以有效地与不同字符序列类型一起使用。
作者
列出所有Java教程。