String、StringBuffer、StringBuilder的区别

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类的缺陷。

image.png

③ StringBuffer的话基本和StringBuilder类差不多,只是StringBuffer类对于字符串的操作方法添加了synchronized关键字,这样一来对于字符串的操作就是线程安全(可以同步访问)的。

image.png
image.png

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的区别

  1. String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  2. StringBuffer与StringBuilder大部分功能是相似的
  3. StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀死一只知更鸟debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值