StringBuffer类详解 及于String字符串的区别(笔记)

目录

StringBuffer类

StringBuffer的特点

面试题:StringBuffer与String区别:

StringBuffer的构造方法:

StringBuffer的添加功能

StringBuffer的删除功能

StringBuffer替换功能

StringBuffer的反转功能

StringBuffer的截取功能

String与StringBuffer之间的转换,为什么要进行相互转换?

关于StringBuffer和StringBuild的重要面试题


StringBuffer类

StringBuffer的特点

1、线程安全的
    不安全,就是存在同步操作同一数据的行为,效率高。
    安全的时候,没有同步操作,效率低。

    在实际开发中,效率和安全着两个问题一直都是很难平衡的问题。
    生活中的例子:
        线程安全的例子:银行的一些业务,电影院卖票,医院取号。
        线程不安全的例子:视频会员,博客评论

2、线程安全的,StringBuffer是一个可变序列

3、StringBuffer又称之为字符串缓冲区,就把它当作一个字符串去操作,只不过它与String相比是可以修改内容的

4、在任何时间点,它包含着一些特定的字符序列,但是可以通过某些方法修改这字符序列的长度和内容

   简单记忆:StringBuffer是一个线程安全的可变序列。

面试题:StringBuffer与String区别:

 1、StringBuffer的长度和内容都可以发生改变,String却不行
 2、String每创建一个新的字符串都会开辟一个新的常量池区域
 StringBuffer会提前给出容量,可以进行字符串的拼接,而不会重新弄开辟空间

StringBuffer的构造方法:

public StringBuffer()  构造一个没有字符的字符串缓冲区,初始容量为16个字符。
public StringBuffer(int capacity)  构造一个没有字符的字符串缓冲区和指定的初始容量。
public StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。

public class StringBufferDemo1 {
    public static void main(String[] args) {
        //创建一个StringBuffer对象,
        StringBuffer sb1 = new StringBuffer("兰智数加学院");
        System.out.println("sb1:"+sb1);//StringBuffer类重写了toString方法
        //如何获取StringBuffer对象的容量
        //public int capacity(),返回容量
        System.out.println("字符串sb1的容量是:"+sb1.capacity());
        //返回当前字符串的长度
        //public int length();
        System.out.println("字符串sb1的长度是:"+sb1.length());

    }
}

StringBuffer的添加功能

 public StringBuffer append(String str):通过观察API发现,不光可以追加字符串,还可以是任意数据类型的追加到StringBuffer中并且无论追加的数据是什么类型,一旦进入到StringBuffer中就是成了字符串

public StringBuffer insert(int index,String str):将一个字符串插入到原字符串中去,从索引位置开始插入,如果插入的是null,则在字符串中显示的就是null四个字符

public class StringBufferDemo2 {
    public static void main(String[] args) {
        //创建一个StringBuffer对象
        StringBuffer sb = new StringBuffer();
        //public StringBuffer append(String str)
        StringBuffer stringBuffer = sb.append("hello");
        System.out.println(stringBuffer);
        System.out.println(sb);
    //我们比较一下sb和stringBuffer,发现两者相等
        System.out.println(sb == stringBuffer);//true
        sb.insert(2, "hadoop");
        System.out.println(sb);
}}

StringBuffer的删除功能

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

public StringBuffer delete(int start,int end),删除字符串中的一个子串,该子串索引从start一直到end-1,注意这里输入的end,实际方法判断的时候是到end-1这个位置

public class StringBufferDemo3 {
    public static void main(String[] args) {
     //新建一个StringBuffer对象
        StringBuffer s1 = new StringBuffer("兰智数加学院");
        s1.append("牛逼");
        System.out.println("字符串s1:"+s1);
        //删除功能
        s1.deleteCharAt(1);
        System.out.println(s1);
        s1.delete(3,5);
        System.out.println(s1);
        //删除StringBuffer里所有的字符
        s1.delete(0,s1.length());
        System.out.println("最终删除后的字符串:"+s1);
    }
}

StringBuffer替换功能

public StringBuffer replace(int start,int end,String str)
用指定的String中的字符替换此序列的子字符串中的String 。
子串开始于指定start并延伸到字符索引end - 1 ,或如果没有这样的字符存在的序列的结束。
第一子串中的字符被去除,然后指定String被插入在start .

public class StringBufferDemo4 {
    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer("我爱你中国");
        s1.replace(3,5,"数加");
        System.out.println(s1);
    }
}

StringBuffer的反转功能

​​​​​public StringBuffer reverse()
导致该字符序列被序列的相反代替。
如果序列中包含任何替代对,则将它们视为单个字符进行反向操作

public class StringBufferDemo5 {
    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer("我爱你中国");
        System.out.println(s1);
        System.out.println("反转之后:");
        StringBuffer s2 = s1.reverse(); // 操作的是同一个StringBuffer对象
        System.out.println(s1);
        System.out.println(s2);
    }
}

StringBuffer的截取功能

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

需要注意的是,这里调用substring方法后,返回的是截取的字符串

public class StringBufferDemo6 {
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer("我爱你中国,I LOVE CHINA");
        String sb2 = sb1.substring(5, 8);
        System.out.println(sb2);//返回的是截取的字符串,对于原来的字符串并没有影响
        System.out.println(sb1);
    }
}

String与StringBuffer之间的转换,为什么要进行相互转换?

A-->B,将A转换成B,是为了使用B中的特有功能
B-->A,再将B转换成A,可能是引用最终的结果需要的是A类型的数据,所以还得转换回来

public class StringBufferDemo7 {
    public static void main(String[] args) {
        //String --> StringBuffer
        String s = "hello";
//        StringBuffer sb = s;
        //java: 不兼容的类型: java.lang.String无法转换为java.lang.StringBuffer
//        StringBuffer sb = "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);
    }
}

关于StringBuffer和StringBuild的重要面试题

面试题1:String,StringBuffer,StringBuilder之间的区别

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

面试题2:StringBuffer和数组的区别?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值