0
点赞
收藏
分享

微信扫一扫

第十五天常用类StringBuffer

unadlib 2022-01-23 阅读 46

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) {
        //public StringBuffer()  构造一个没有字符的字符串缓冲区,初始容量为16个字符。
          StringBuffer sb1=new StringBuffer();
        System.out.println("sb1:"+sb1);//StringBuffer重写了toString方法
        //如何获取StringBuffer的容量
        //public int capacity()返回当前容量。
        System.out.println("当前StringBuffer的容量为"+sb1.capacity());
        //public int length()返回长度(字符数)。
        System.out.println("StringBuffer中字符串的长度为:"+sb1.length());
        System.out.println("=================================");
        //public StringBuffer(int capacity)  构造一个没有字符的字符串缓冲区和指定的初始容量。
        StringBuffer sb2=new StringBuffer(50);
        System.out.println("sb2:"+sb2);
        //public int capacity()返回当前容量。
        System.out.println("当前StringBuffer的容量为"+sb2.capacity());
        //public int length()返回长度(字符数)。
        System.out.println("StringBuffer中字符串的长度为:"+sb2.length());
        System.out.println("=================================");
        //public StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。
StringBuffer sb3=new StringBuffer("hello");
        System.out.println("sb3:"+sb3);
        //public int capacity()返回当前容量。
        System.out.println("当前StringBuffer的容量为"+sb3.capacity());// 21 = 16 + 5
        //public int length()返回长度(字符数)。
        System.out.println("StringBuffer中字符串的长度为:"+sb3.length());
    }
}

StringBuffer的添加功能

public StringBuffer append(String str)

通过观察API发现,不光可以追加字符串,还可以是任意数据类型的追加到StringBuffer中

返回的StingBuffer是什么呢?

public StringBuffer insert(int index,String str)

public class StringBufferDemo2 {
    public static void main(String[] args) {
    StringBuffer sb=new StringBuffer();
    //public StringBuffer append(String str)
    StringBuffer stringBuffer=sb.append("hello");
        System.out.println(stringBuffer);
        System.out.println(sb);
        System.out.println(sb==stringBuffer);
        //        sb.append(10);
//        sb.append('a');
//        sb.append(true);
//        sb.append(12.34);
//        //无论追加的数据是什么类型,一旦进入到StringBuffer中就是成了字符串
//        System.out.println(sb);
//        System.out.println(stringBuffer);

        //链式编程追加
        sb.append(10).append('a').append(true).append(12.34);
        System.out.println(sb);
        System.out.println("==========================");
        //public StringBuffer insert(int offset,String str)
        // 将字符串插入到此字符序列中。返回的是字符串缓冲区本身
        //String参数的String按顺序插入到指定偏移量的该序列中,向上移动原始位于该位置的任何字符,
        // 并将该序列的长度增加到参数的长度。
        sb.insert(5,"hadoop");
        System.out.println(sb);
        // 如果str是null ,则四个字符"null"被插入到该序列中。
//        sb.insert(5,null);报错
        Object o=null;
        sb.insert(5,o);
        System.out.println(sb);
    }
}

remove,move,delete,drop,truncate

StringBuffer的删除功能

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

public StringBuffer delete(int start,int end)

public class StringBufferDemo3 {
    public static void main(String[] args) {
        StringBuffer sb=new StringBuffer("bigdata");
        System.out.println("未做删除操作前的StringBuffer:"+sb);
        //        StringBuffer sb2 = sb.deleteCharAt(3); // 操作的是同一个StringBuffer对象
//        System.out.println(sb);
//        System.out.println(sb2);
//        System.out.println(sb==sb2);
        sb.deleteCharAt(3);
        System.out.println("做删除操作后的StringBuffer:"+sb);
        //如果 index为负数或大于或等于length() 。
        //index的值最大可以取到实际存储字符串的长度-1
//         sb.deleteCharAt(30);
//        System.out.println(sb);会报错
        System.out.println("====================");
        //public StringBuffer delete(int start,int end)
        //删除此序列的子字符串中的字符。
        // 子串开始于指定start并延伸到字符索引end - 1 ,或如果没有这样的字符存在的序列的结束。
        // 如果start等于end ,则不作任何更改。
        //  start<=index<end
        //bigata
//        sb.delete(2,5);
//        sb.delete(2,6);
//        sb.delete(2,10);
        //注意开始位置一定是已经存在的索引,否则报错
//        sb.delete(8,10);
        System.out.println(sb);

        //需求:删除StringBuffer中的所有字符
        sb.delete(0, sb.length());
        System.out.println("删除StringBuffer中的所有字符:" + sb);

    }
}

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 sb=new StringBuffer();
        //往StringBuffer中添加一些内容
        sb.append("java").append("mysql").append("hadoop").append("hive").append("spark").append("flink");
        System.out.println(sb);
        //public StringBuffer replace(int start,int end,String str)
        sb.replace(5,10,"真好");
        System.out.println(sb);
    }
}

StringBuffer的反转功能

public StringBuffer reverse()

导致该字符序列被序列的相反代替。

如果序列中包含任何替代对,则将它们视为单个字符进行反向操作

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

    }
}

StringBuffer的截取功能

public String substring(int start)

返回一个新的String ,其中包含此字符序列中当前包含的字符的子序列。

public String substring(int start,int end)

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

public class StringBufferDemo6 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        sb.append("java")
                .append("mysql")
                .append("hive")
                .append("ETL")
                .append("spark");
        System.out.println(sb);

        //public String substring(int start)
        //不会改变原来StringBuffer中的数据
        //返回值是一个String类型的数据
        String s1 = sb.substring(4);
        System.out.println("截取的内容是:"+s1);
        System.out.println("StringBuffer的内容为:"+sb);

        //public String substring(int start,int end) 含头不含尾 [start,end)
        //javamysqlhiveETLspark
        String s2 = sb.substring(9, 13);
        System.out.println("截取的内容是:"+s2);
        System.out.println("StringBuffer的内容为:"+sb);



    }
}

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);


    }
}

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

1、StringBuffer是线程同步安全的,数据安全,效率低。

StringBuilder不是线程同步安全的,数据不安全,效率高。

2、String的内容是不可改变的,StringBuffer和StringBuilder是可变序列。

3、StringBuffer中方法上有synchronized关键字。

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

它们都可以被看作是一个容器,装一些数据。

但是,StringBuffer里面的数据都是一个一个字符

数组可以存放不同数据类型的数据,但是同一个数组只能存放同一种数据类型的数据。

看程序写结果:

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

public class StringBufferDemo8 {
    public static void main(String[] args) {
//        //创建一个StringBuffer的对象
//        StringBuffer stringBuffer = new StringBuffer();
//        //创建一个StringBuilder的对象
//        StringBuilder stringBuilder = new StringBuilder();
        String s1 = "hello";
        String s2 = "world";
        System.out.println("s1: " + s1 + ",s2: " + s2);
        change(s1, s2);
        System.out.println("s1: " + s1 + ",s2: " + s2);

        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
        //当多个StringBuffer作为参数传参的时候,谁发生了操作,谁就会受到影响‘

    }


    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;
        System.out.println("s1: " + s1 + ",s2: " + s2);
    }
}

把数组拼接成一个字符串(用StringBuffer实现)

public class StringBufferTest1 {
    public static void main(String[] args) {
        char[] chars = {'a','b','c','d'};

        //创建一个空的StringBuffer对象
        StringBuffer sb = new StringBuffer();

        //遍历数组得到每一个字符
        for(int i=0;i<chars.length;i++){
            sb.append(chars[i]);
        }

        //将字符缓冲区转换一个字符串
        String s = sb.toString();
        System.out.println(s);


    }
}

把字符串反转 (键盘录入字符串)

"qwerdf" --> "fdrewq"

import java.util.Scanner;

public class StringBufferTest2 {
    public static void main(String[] args) {
        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串:");
        String stringLine = sc.next();

        //方式1:使用String的拼接方式
        String s = "";
        //将字符串转换成字符数组
        char[] chars = stringLine.toCharArray();
        //倒着遍历字符数组
        for (int i = chars.length - 1; i >= 0; i--) {
            s += chars[i];
        }
        System.out.println(stringLine + "反转之后的结果为:" + s);

        System.out.println("========================================");
        //方式2:StringBuffer中有一个reverse()方法实现
        //将输入的String类型的数据转换成StringBuffer类型
        StringBuffer sb = new StringBuffer(stringLine);
        sb.reverse();
        //将StringBuffer类型转换回去String类型
        String s1 = sb.toString();
        System.out.println(stringLine + "反转之后的结果为:" + s1);

        System.out.println("=====================链式编程改进:=====================");
        System.out.println(new StringBuffer(stringLine).reverse().toString());

    }
}

判断一个字符串是否是对称字符串

例如"abc"不是对称字符串,"aba"、"abba"、"aaa"、"mnanm"是对称字符串

分析:

1、第1个字符与最后一个字符去比较

2、第2个字符与倒数第2个字符去比较

3、第3个字符与倒数第3个字符去比较

4、...

比较的次数: length()/2

import java.util.Scanner;

public class StringBufferTest3 {
    public static void main(String[] args) {
        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要判断的字符串:");
        String stringLine = sc.next();

        //方式1:一个一个的去比较
        //将输入的字符串转化成字符数组
        boolean flag = true;
        char[] chars = stringLine.toCharArray();
        for (int start = 0, end = chars.length - 1; start <= end; start++, end--) {
            if (chars[start] != chars[end]) {
                System.out.println("该字符串不是对称字符串");
                flag = false;
                break;
            }
        }
        if (flag) {
            System.out.println("该字符串是对称字符串");
        }

        System.out.println("=========================================================");
        //方式2:利用StringBuffer中反转方法,如果反转之前与反转之后的字符串是一样的,说明是对称字符串
        //将输入的String类型的数据转化成StringBuffer类型的数据
        StringBuffer sb = new StringBuffer(stringLine);
        sb.reverse();
        //再将反转后的StringBuffer类型的数据转换成String类型的数据
        String s = sb.toString();

        if (s != null) {
            if (s.equals(stringLine)) {
                System.out.println("该字符串是对称字符串");
            } else {
                System.out.println("该字符串不是对称字符串");
            }
        }
    }
}



举报

相关推荐

HCIP 第十五天

HCIP第十五天

第十五天6号

学习javaweb第十五天

打卡学习第十五天

Java web第十五天

学习C语言第十五天

0 条评论