API常用类之StringBuffer类

我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。而StringBuffer就可以解决这个问题线程安全的可变字符序列

StringBuffer、String和StringBuilder之间的区别

StringBuffer类

线程安全(synchronized)有上锁

当向StringBuffer中添加内容时,是将内容添加到底层的数组中,数组没有被final修饰,当数组装满时,会创建一个新的数组,将新数组地址给底层数组,StringBuffer对象是不会改变的.(若频繁的对字符串进行修改,最好使用StringBuffer)

// 线程安全, 可变字符串
private transient char[] toStringCache;//创建一个数组来存放字符串元素
public StringBuffer() {
        super(16);//如果创建时,没有输入字符串,则默认容量为16
    }
public StringBuffer(int capacity) {
        super(capacity);//可以规定长度
    }
public StringBuffer(String str) {
        super(str.length() + 16);//输入的字符串长度加上默认的16长度
        append(str);//向末尾追加字符串
    }    
public StringBuffer(CharSequence seq) {
        this(seq.length() + 16);//
        append(seq);
    }
//内存超出时,再创建一个新的数组
 AbstractStringBuilder(int capacity) {
                value = new char[capacity];
            }

String类

String+="abc"时,每次创建的都是一个新的对象,因为它的底层数组被final修饰,给数组赋值后就不能再更改了。

private final char value[];
//String类中底层的数组被final修饰,只能输入一次,再输入时就创建了一个新的对象  private static final ObjectStreamField[] serialPersistentFields =new ObjectStreamField[0]; 
public String() {        
     this.value = "".value;    
  } 
public String(String original) {        
        this.value = original.value;        
        this.hash = original.hash;    
  }
public String(char value[]) {        
        this.value = Arrays.copyOf(value, value.length);    
   }//传入一个字符类型的数组,将数组转换为字符串类型

StringBuilder类

线程不安全(在单线程且有大量数据时使用)

StringBuilder类功能和StringBuffer功能完全一致

多线程不安全 可变字符串
@Override 
public StringBuilder append(String str) {                    
       super.append(str); 
       return this;  
  }  
@Override  
public synchronized StringBuffer append(String str) {              
       toStringCache = null;
       super.append(str);
       return this;
  }

● String:是字符常量,适用于少量的字符串操作的情况

● StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

● StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

构造方法

public StringBuffer() //无传参构造方法,默认长度为16

public StringBuffer(String str)//有参构造方法,长度为传入字符串长度+16

添加功能

public StringBuffer append(String str) //传入的字符串接在原字符串后面

StringBuffer stringBuffer =    new StringBuffer("abcd");//20
                     stringBuffer.append("efg111");//abcdefg111

public StringBuffer insert(int offset,String str)

StringBuffer stringBuffer = new StringBuffer("abcdefg");//23     
stringBuffer.insert(2,"xx");//向指定的位置插入字符串
//abxxcdefg

删除功能

public StringBuffer deleteCharAt(int index) //删除指定位置的字符串(索引位置)

public StringBuffer delete(int start,int end) //删除指定区间的内容([0,3))

 StringBuffer stringBuffer =new StringBuffer("abcdefg");//23
                     stringBuffer.deleteCharAt(1);//acdefg
                     stringBuffer.delete(0,3);//删除指定区间的内容 包含开始,不包含结束

替换功能

public StringBuffer replace(int start,int end,String str) //使选择区间的字符串替换为输入的新字符串

StringBuffer stringBuffer =new StringBuffer("abcdefg");//23
stringBuffer.replace(0,3, "XXX");//替换
System.out.println(stringBuffer);//XXXdefg

反转功能

public StringBuffer reverse()//反转数组的顺序

StringBuffer stringBuffer =new StringBuffer("abcdefg");//23
stringBuffer.reverse();//逆序字符串
 System.out.println(stringBuffer);//gfedcba 

length()方法

StringBuffer stringBuffer =new StringBuffer("abcdefg");//23
String s1="abcd";
System.out.println(s1.length());//4
System.out.println(stringBuffer.length());//返回的是底层数组中实际转入的字符个数    7

截取功能

public String substring(int start)

public String substring(int start,int end)

 StringBuffer stringBuffer =    new StringBuffer("abcdefg");
String sub1 =  stringBuffer.substring(2);//截取一个字符串副本返回
String sub2 =  stringBuffer.substring(2,5);//截取一个字符串副本返回
System.out.println(sub1);//cdefg
System.out.println(sub2);//cde

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值