String、StringBulider、StringBuffer

24 篇文章 0 订阅
20 篇文章 0 订阅

一、String、StringBulider、StringBuffer区别

1、String(JDK1.0)是不可变字符序列
2、StringBuffer(JDK1.0)是可变字符序列,可以对内容进行增删,此时不会产生新的对象,效率低,线程安全

  • StringBuffer有三个构造器
StringBuffer();  //初始容量为16的字符串缓冲区
StringBuffer(int size);  //构造指定的初始容量
StirngBuffer(String str); //将内容初始化为指定的字符串内容

3、StringBuilder(JDK5.0)是可变字符序列,与StringBuilder类似,其中提供的相关功能也一样,效率高,线程不安全

4、在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。

二、StringBuffer常用方法

StringBuffer append(xxx); //提供了很多的append方法,用于字符串拼接
StringBuffer delete(int start,int end);  //删除指定位置的字符,左闭右开
StringBuffer replace(int start,int end,String str); //把[start,end)位置换成str,左闭右开
StringBuffer insert(int offset,xxx); //在指定位置插入xxx
StringBuffer reverse(); //把当前字符串序列逆转

  • 特别的,当append和insert方法时,如果长度不够可扩容
  • 支持方法链操作

三、一些其他的问题

今天再刷力扣题时看到这样一个题目
在这里插入图片描述
自己一开始写的方法:

class Solution {
    public String replaceSpace(String s) {
         int length = s.length();
          if(s == null){
              return null;
          }
          String a = "";
          for(int i = 0;i<length;i++){
              if(s.charAt(i)==' '){
                  a+="%20";
                  continue;
              }
              a+=s.charAt(i);
          }
        return a;
    }
}

在这里插入图片描述

自己写了之后效率很低,看了一些题解和大佬的评论之后总结如下:

在Java for循环内部最好不要使用拼接字符串,否则每次循环都会重新new对象,对性能有一定的影响,虽然在jdk1.5已经优化了,但是jdk1.5+的优化好像是在每次循环体内 new 一个StringBuilder对象,再调用append方法,还是会产生垃圾对象,所以还是推荐在循环体外手动new 一个 StringBuilder对象。
不过经过测试确实是这样,对于拼接字符串来说
在这里插入图片描述
运行耗时大大增加,但是一开始对字符串进行操作时,最好使用StringBuilder类进行操作,以下是优化版

class Solution {
    public String replaceSpace(String s) {
         int length = s.length();
          if(s == null){
              return null;
          }
          StringBuilder string = new StringBuilder();
          for(int i = 0;i<length;i++){
              if(s.charAt(i)==' '){
                  string.append("%20");
                  continue;
              }
              string.append(s.charAt(i));
          }
        return string.toString();
    }
}

在这里插入图片描述
这个题目还有另外一个简单的方法,也是一开始写的,已经有的轮子自己用罢了,但是面试的时候估计就让回去等通知了

class Solution {
    public String replaceSpace(String s) {
         int length = s.length();
          if(s == null){
              return null;
          }
        return s.replaceAll(" ","%20");
    }
}

这个方法也是没问题的,不过耗时也高
题目链接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
StringStringBufferStringBuilder都是Java中常用的字符串类,它们之间的区别主要体现在以下几个方面: 1.可变性:String是不可变的字符串,每次对String进行操作都会生成一个新的String对象;而StringBufferStringBuilder是可变的字符串,可以对其进行增删改操作,而不会生成新的对象。 2.线程安全性:String是不可变的,因此是线程安全的;而StringBuffer是线程安全的,因为它的所有公共方法都是使用synchronized关键字进行同步的;而StringBuilder是非线程安全的,因为它的所有方法都没有进行同步操作。 3.性能:对于单线程环境下的字符串操作,StringBufferStringBuilder的性能都比String好,因为它们不需要创建新的对象;而对于多线程环境下的字符串操作,由于StringBuffer是线程安全的,因此可能会影响效率,而StringBuilder是非线程安全的,因此可以获得更好的性能。 4.使用场景:由于String是不可变的,因此适合在多线程环境下使用,而StringBuffer适合在单线程环境下进行字符串操作,并且需要保证线程安全性的情况下使用;而StringBuilder适合在单线程环境下进行字符串操作,并且不需要考虑线程安全性的情况下使用。 总之,如果需要对字符串进行增删改操作,可以使用StringBufferStringBuilder;如果需要保证线程安全性,可以使用StringBuffer;如果不需要考虑线程安全性,可以使用StringBuilder。如果只需要对字符串进行读取操作,可以使用String

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值