1. CharSequence接口
String、StringBuffer和StringBuilder 都实现 CharSequence接口
在JDK1.4中,引入了CharSequence接口,实现了这个接口的类有:CharBuffer、String、StringBuffer、StringBuilder这个四个类。
2. 运算速度
通常情况下:StringBuilder > StringBuffer > String
如下的代码写法形式速度会很慢,JVM会不断地创建和回收对象来进行操作。
String str1 = "abc";
String str2 = "de";
String str = str1 + str2;
3. 线程安全性
StringBuilder(非线程安全)
而StringBuilder的方法没有该关键字修饰,所以不能保证线程安全性。是JDK1.5新增的,该类提供一个与StringBuffer兼容的API,但不能保证同步,所以在性能上较高。该类被设计用作 StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer 要快。两者的方法基本相同。
StringBuffer(线程安全的)
StringBuffer中大部分方法由synchronized关键字修饰,在必要时可对方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致,所以是线程安全的。类似于String的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。StringBuffer上的主要操作是 append 和 insert方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
4. 适用于场景
String:适用于少量的字符串操作。
StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。
StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。
5. 常用方法
5.1 String
-
charAt(int index)
取下标为 index 的字符,返回为 char -
substring(int beginIndex)
截取字符串的一部分,有很多重载 -
split(String regex)
以 regex 为分隔符组成数组,返回为 String[]
String str = "ab,cde";
String[] split = str.split(",");
- replace(CharSequence target, CharSequence replacement)
CharSequence 是个接口,有 CharBuffer、String、StringBuffer、StringBuilder这个四个类。
-
replaceFirst(String regex, String replacement)
-
replaceAll(String regex, String replacement)
替换字符串,replace 和 replaceAll 好像没区别 -
concat(String str)
好像跟 “+” 一样,拼接字符串 -
toCharArray()
将 字符串 转为 char[] -
String.valueOf(xxx)
静态方法,将 xxx 转为 String,返回值为 String
5.2 StringBuffer
-
append(String str)
拼接字符串,有很多重载 -
replace(int start, int end, String str)
跟 String 的 replace 有点不一样 -
reverse()
字符串颠倒 -
insert(int offset, Object obj)
插入字符串 -
delete(int start, int end)
删除字符串 -
deleteCharAt(int index)
删除一个字符