StringBuffer类,StringBuffer类和String的区别、String,StringBuffer,StringBuilder之间的区别

1、概述

StringBuffer是一个线程安全的可变序列。

2、StringBuffer与String区别

(1)StringBuffer的长度和内容都可以发生改变,String却不行

(2)String每创建一个新的字符串都会开辟一个新的常量池区域而StringBuffer会提前给出容量,可以进行字符串的拼接,而不会重新开辟空间

3、构造方法

(1)public StringBuffer() :构造一个没有字符的字符串缓冲区,初始容量为16个字符。

     public int capacity() :返回当前容量,字符串长度为实际值,容量是新开辟的空间的长度,是理论值。

StringBuffer sb1 = new StringBuffer();
System.out.println("当前StringBuffer的容量为:" + sb1.capacity());//容量为16

(2)public StringBuffer(int capacity) : 构造一个没有字符的字符串缓冲区和指定的初始容量,可以指定容量

(3)public StringBuffer(String str) :构造一个初始化为指定字符串内容的字符串缓冲区。

StringBuffer sb2 = new StringBuffer("hello");
System.out.println("当前StringBuffer的容量为:" + sb3.capacity());//容量为默认容量16+字符串长度,16+5=21.

4、添加功能的方法

(1)public StringBuffer append(String str):无论什么数据类型都能通过此方法加到字符串里面。

StringBuffer s = new StringBuffer();
StringBuffer s2 = sb.append("hello");
s.append("hello");//返回的是增加过后的s。
System.out.println(sb == stringBuffer);//true,地址相同,增加后地址没有改变,s和s2都指向改地址。
sb.append(10).append('a').append(true).append(12.34);//链式编程增加。

(2)public StringBuffer insert(int index,String str):在指定位置index处,插入字符串str。

sb.insert(5, "null");//在字符串sb位置5处插入null字符串,其余字符串后移,插入后值返回sb中。

5、StringBuffer的删除功能

(1)public StringBuffer deleteCharAt(int index) :删除指定索引处的字符。该序列缩短了一个字符

(2)public StringBuffer delete(int start,int end):删除此序列的子字符串中的字符,子字符串开始于指定start并延伸到字符索引end - 1,start超出了总字符的长度,会报错,end超出没事。  如果start=end ,则不作任何更改

6、StringBuffer替换功能

(1)public StringBuffer replace(int start,int end,String str):从start开始到end-1的字符串被str替换。

StringBuffer sb = new StringBuffer("helloworld");
sb.replace(2,7,"DDDDD");//heDDDDDrld

7、StringBuffer的反转功能

(1)public StringBuffer reverse():导致该字符序列被序列的相反代替,操作的是同一个StringBuffer对象

 StringBuffer sb = new StringBuffer();
 sb.append("我爱你中国");
 sb.reverse();
 System.out.println(sb);//国中你爱我

8、StringBuffer的截取功能

(1)public String substring(int start) :返回一个新的String ,其中包含此字符序列中当前包含的字符的子序列。

(2)public String substring(int start,int end) :返回一个新的String ,其中包含此序列中当前包含的字符的子序列。 子串起始于指定的start ,并扩展到索引号为end - 1 。

StringBuffer sb = new StringBuffer();
sb.append("javaljdfkljsflsld");
String s1 = sb.substring(4);  //返回值是一个String类型的数据
System.out.println("截取的内容是:"+s1);  //ljdfkljsflsld
System.out.println("StringBuffer的内容为:"+sb);//不会改变原来StringBuffer中的数据
        
String s2 = sb.substring(9, 13);
System.out.println("截取的内容是:"+s2);  //ljsf
System.out.println("StringBuffer的内容为:"+sb);//不会改变原来StringBuffer中的数据

9、String和StringBuffer的相互转化

 //String --> StringBuffer
        String s = "hello"; 
        //方式1:通过构造方法转换
        StringBuffer sb1 = new StringBuffer(s);
        System.out.println(s);
        System.out.println(sb1);
        //方式2:通过append()
        StringBuffer sb2 = new StringBuffer();
        sb2.append(s);
        System.out.println(s);
        System.out.println(sb2);

        System.out.println("==============================================");
//StringBuffer --> String
        StringBuffer sb3 = new StringBuffer("bigdata");
        //方式1:toString()方法
        String s1 = sb3.toString();
        System.out.println(sb3);
        System.out.println(s1);
        //方式2:subString
        String s2 = sb3.substring(0);
        System.out.println(s2);
        System.out.println(sb3);
        //方式3:String类的构造方法
        //String(StringBuffer buffer)
        //分配一个新的字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。
        String s3 = new String(sb3);
        System.out.println(s3);
        System.out.println(sb3);

10、String,StringBuffer,StringBuilder之间的区别

(1)StringBuffer是线程同步安全的,数据安全,效率低。StringBuilder不是线程同步安全的,数据不安全,效率高。
(2)String的内容是不可改变的,StringBuffer和StringBuilder是可变序列。
(3)StringBuffer中方法上有synchronized关键字。

11、StringBuffer和数组的区别?

它们都可以被看作是一个容器,装一些数据。但是,StringBuffer里面的数据都是一个一个字符
数组可以存放不同数据类型的数据,但是同一个数组只能存放同一种数据类型的数据。

12、案例说明

探究String作为参数传递与StringBuffer作为参数传递的区别。

public class StringBufferDemo8 {
    public static void main(String[] args) {

        String s1 = "hello";
        String s2 = "world";
        System.out.println("s1: " + s1 + ",s2: " + s2);//s1: hello,s2: world
        change(s1, s2);       //s1: world,s2: worldworld
        System.out.println("s1: " + s1 + ",s2: " + s2);//s1: hello,s2: world;

        System.out.println("========================================");
        StringBuffer sb1 = new StringBuffer("hello");
        StringBuffer sb2 = new StringBuffer("world");
        System.out.println("sb1: " + sb1 + ",sb2: " + sb2); // hello world
        change(sb1, sb2);                
        System.out.println("sb1: " + sb1 + ",sb2: " + sb2); // sb1: hello,sb2: worldworld。

    }


    public static void change(StringBuffer sb1, StringBuffer sb2) {
        sb1 = sb2;
        sb2.append(sb1);
        System.out.println("sb1: " + sb1 + ",sb2: " + sb2); //sb1: worldworld,sb2: worldworld
    }

    public static void change(String s1, String s2) {
        s1 = s2;//s2的地址给了s1
        s2 = s1 + s2; //变量相加,直接开辟新空间
        System.out.println("s1: " + s1 + ",s2: " + s2);//s1: world,s2: worldworld
    }
}

 运行方法时,在栈中开辟了一块空间,第一句sb1的地址指向了sb2 的地址,第二句在常量池中开辟了一个新地址返回给了堆中的0x002,方法中sb1和sb2都指向改0x002,调用输出语句,方法结束后,输出语句调用的是main中地址,sb1地址指向的值没变,而sb2变了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值