StringBuilder
用于表示可变字符串的类,是非线程安全的,建议在单线程下使用
StringBuffer
用于表示可变字符串的类,是线程安全的,建议在多线程环境下使用
StringBuilder和StringBuffer中的方法都一致,只不过StringBuffer中的方法使用了synchronized修饰,表示是一个同步方法,在多线程环境下不会出现问题
构造方法(这里以StringBuilder为例)
常用构造方法 | 作用 |
---|---|
StringBuilder() | 创建一个大小为16的字符串数组,表示一个空白字符 |
StringBuilder(int i) | 创建一个大小为 i 的字符串数组,表示一个空白字符 |
StringBuilder(String str) | 创建一个str长度+16的字符串数组,将str添加到其中,类似与String str = "值" |
普通方法(这里以StringBuilder为例)
常用方法 | 返回值 | 作用 | 备注 |
---|---|---|---|
append(Object obj) | StringBuilder | 将任意类型的参数添加到原可变字符串末尾 | |
delete(int start,int end) | StringBuilder | 在原可变字符串中删除索引以start开始到end结束的内容 | 包含start,不包含end |
sb.deleteCharAt(int index); | StringBuilder | 在原可变字符串中删除索引为index的内容 | |
sb.insert(int offset,Object obj); | StringBuilder | 在原可变字符串中以索引offset开始插入obj的内容 | |
replace(int start,int end,String str); | StringBuilder | 在原可变字符串中将索引以start开始到end结束的内容,替换成为str | 包含start,不包含end |
reverse(); | StringBuilder | 将原可变字符串倒序 | |
scodePointAt(int idnex); | int | 返回指定索引index的ASCII码值 |
注意
以上表格中的方法都是直接操作同一个字符串对象,每次调用方法后原字符串都会发生变化
StringBuilder和StringBuffer中没有重写equals方法,判断可变字符串值是否相同可以转为String再使用equals方法
特殊的将可变字符串转换为String的方式 : 直接加一个""
StringBuilder sb = new StringBuilder();
sb.append("a123456789");
String str = sb + "";
以下代码输出true
StringBuilder sb = new StringBuilder();
sb.append("a123456789");
StringBuilder sb2 = new StringBuilder();
sb2.append("a123456789");
System.out.println(String.valueOf(sb).equals(String.valueOf(sb2)));
String,StringBuffer,StringBuilder的异同
相同点
1.都可以表示字符串,操作字符串
2.有相同的方法,如: indexOf().charAt()
3.都是被final修饰的类,不能被继承
不同点
1.String定义的字符串是一个常量,不可变.StringBuffer,StringBuilder定义的字符串是可变的.
2. String类中的方法调用后不会改变原本字符串的值,StringBuffer,StringBuilder调用方法后会改变字符串的值
3.StringBuffer 是线程安全的,其中的方法是被synchronized修饰的,StringBuilder,是非线程安全的