String 、StringBuilder、StringBuffer
① 由于String对象不可变,每个操作都会产生新的对象,效率非常低,并且频繁的创建对象也会浪费内存。
字符串拼接 + 的底层其实是StringBuilder.append()方法,下面原生的String字符拼接,底层其实会创建1000个StringBuilder对象,浪费堆内存空间。
public static void main(String[] args) {
String str = "hello";
for(int i = 0;i<1000;i++){
str = str + i;
}
}
改进版使用StringBuilder进行拼接,只创建了一个StringBuilder对象。
public static void main(String[] args) {
String str = "hello";
StringBuilder sb = new StringBuilder(str);
for(int i = 0;i<1000;i++){
sb.append(i);
}
}
② StringBuilder类,可以在原字符串的基础上进行操作,并且不会开辟额外的内存空间,从而弥补了String类的缺陷。
③ StringBuffer的话基本和StringBuilder类差不多,只是StringBuffer类对于字符串的操作方法添加了synchronized关键字,这样一来对于字符串的操作就是线程安全(可以同步访问)的。
StringBuffer和StringBuilder的对比:
- StringBuffer线程更安全,StringBuilder速度更快。
- 修改字符串推荐使用StringBuffer,但是StringBuilder速度更快,通常都是使用StringBuilder。
④ 常用方法(StringBuilder和StringBuffer都差不多,就列举StringBuffer的了):
方法 | 说明 |
---|---|
StringBuffer append(String str) | 在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、 double、float、int、long、Object、String、StringBuff的变量 |
char charAt(int index) | 获取index位置的字符 |
int length() | 获取字符串的长度 |
int capacity() | 获取底层保存字符串空间总的大小 |
void ensureCapacity(int mininmumCapacity) | 扩容 |
void setCharAt(int index, char ch) | 将index位置的字符设置为ch |
int indexOf(String str) | 返回str第一次出现的位置 |
int indexOf(String str, int fromIndex) | 从fromIndex位置开始查找str第一次出现的位置 |
int lastIndexOf(String str) | 返回最后一次出现str的位置 |
int lastIndexOf(String str, int fromIndex) | 从fromIndex位置开始找str最后一次出现的位置 |
StringBuffer insert(int offset, String str) | 在offset位置插入:八种基类类型 & String类型 & Object类型数据 |
StringBuffer deleteCharAt(int index) | 删除index位置字符 |
StringBuffer delete(int start, int end) | 删除[start, end)区间内的字符 |
StringBuffer replace(int start, int end, String str ) | 将[start, end)位置的字符替换为str |
String substring(int start) | 从start开始一直到末尾的字符以String的方式返回 |
String substring(int start,int end) | 将[start, end)范围内的字符以String的方式返回 |
StringBuffer reverse() | 反转字符串 |
String toString() | 将所有字符按照String的方式返回 |
public static void main(String[] args) {
// 1.StringBuilder 常用方法 capacity length append reverse delete insert replace
StringBuilder sb = new StringBuilder(10);
System.out.println(sb.capacity()); //10
System.out.println(sb.length()); // 0
sb.append("robin");
System.out.println(sb);
sb.append("-----");
sb.append("debug");
System.out.println(sb);
sb.reverse();
System.out.println(sb);
sb.delete(0,3);
System.out.println(sb);
sb.insert(0,"ok!");
System.out.println(sb);
sb.replace(0,3,"no");
System.out.println(sb);
}
⑤ 小结:String、StringBuffer、StringBuilder的区别
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作