Java字符串
首先看一下以下三篇文章,作者写的很不错:
String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
以下是总结:
CharSequence,String,StringBuilder和StringBuffer的关系

CharSequence是一个接口,它只包括length(), charAt(int index), subSequence(int start, int end)这几个API接口。
public class Main {
public static void main(String[] args) {
CharSequence cs = "hello world!";
print(cs.length()); // 12
print(((String) cs).substring(1,2)); //e
print(cs.charAt(2)); //l
}
public static void print(Object obj) {
System.out.println(obj);
}
}
CharSequence就是字符序列,String, StringBuilder和StringBuffer本质上都是通过字符数组实现的!
StringBuilder和StringBuffer都是可变的字符序列。它们都继承于AbstractStringBuilder,实现了CharSequence接口。
但是,StringBuilder是非线程安全的,而StringBuffer是线程安全的。(java什么叫线程安全?什么叫不安全?)
示例
public class Main {
public static void main(String[] args) {
System.out.println("-------------------------------- testCharSequence -----------------------------");
// 1. CharSequence的子类String
String str = "abcdefghijklmnopqrstuvwxyz";
System.out.println("1. String");
System.out.printf(" %-30s=%d\n", "str.length()", str.length());
System.out.printf(" %-30s=%c\n", "str.charAt(5)", str.charAt(5));
String substr = (String)str.subSequence(0,5);
System.out.printf(" %-30s=%s\n", "str.subSequence(0,5)", substr.toString());
// 2. CharSequence的子类StringBuilder
StringBuilder strbuilder = new StringBuilder("abcdefghijklmnopqrstuvwxyz");
System.out.println("2. StringBuilder");
System.out.printf(" %-30s=%d\n", "strbuilder.length()", strbuilder.length());
System.out.printf(" %-30s=%c\n", "strbuilder.charAt(5)", strbuilder.charAt(5));
// 注意:strbuilder的subSequence()返回的是,实际上是一个CharSequence 类型!
String substrbuilder = (String)strbuilder.subSequence(0,5);
System.out.printf(" %-30s=%s\n", "strbuilder.subSequence(0,5)", substrbuilder.toString());
// 3. CharSequence的子类StringBuffer
StringBuffer strbuffer = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
System.out.println("3. StringBuffer");
System.out.printf(" %-30s=%d\n", "strbuffer.length()", strbuffer.length());
System.out.printf(" %-30s=%c\n", "strbuffer.charAt(5)", strbuffer.charAt(5));
// 注意:StringBuffer的subSequence()返回的是,实际上是一个CharSequence 类型!
String substrbuffer = (String)strbuffer.subSequence(0,5);
System.out.printf(" %-30s=%s\n", "strbuffer.subSequence(0,5)", substrbuffer.toString());
System.out.println();
}
}
结果:
-------------------------------- testCharSequence -----------------------------
1. String
str.length() =26
str.charAt(5) =f
str.subSequence(0,5) =abcde
2. StringBuilder
strbuilder.length() =26
strbuilder.charAt(5) =f
strbuilder.subSequence(0,5) =abcde
3. StringBuffer
strbuffer.length() =26
strbuffer.charAt(5) =f
strbuffer.subSequence(0,5) =abcde
Last updated
Was this helpful?