• Java基础-----StringBuffer和StringBuilder


    1.StringBuffer

    • 内容可变的字符串类,适应StringBuffer来对字符串的内容进行动态操作,不会产生额外的对象。
    • StringBuffer在初始时,默认是有16个字符来作为缓冲区
    public StringBuffer(int capacity) {
            super(capacity);
        }
    public StringBuffer() {
            super(16);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.1 构造方法

    • new StringBuffer();
    • new StringBuffer(String);
    • new StringBuffer(int);
    • new StringBuffer(charSequence);
    public class TestStringBuffer {
        public static void main(String[] args) {
            StringBuffer stringBuffer=new StringBuffer("abc");
            //append():在当前StringBUffer对象上,追加其他内容
            stringBuffer.append("ccc");
            /**
             * 与String不一样
             * StringBuffer中的所有操作都是在原有的StringBuffer上做的修改
             */
            System.out.println(stringBuffer);//abcccc
            //StringBuffer对象可以无限追加操作
            stringBuffer.append("XXX").append(12);
            System.out.println(stringBuffer);//abccccXXX12
            //将StringBuffer对象转为String类型
            String x=stringBuffer.toString();//这里拿到的是String对象
            System.out.println(x);//abccccXXX12
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    比较String和StringBuffer的效率

    public class TestStringBuffer {
        public static void main(String[] args) {        
            //10万个字符串累加效果    对比String和StringBUffer的效率
            
            //String
            long t1= System.currentTimeMillis();
            String str=new String("abc");   
            for (int i = 0; i < 100000; i++) {
                str+="abc";
            }
            long t2=System.currentTimeMillis();
            long t=t2-t1;
            System.out.println(t);//2687   2539   2542
    
            //StringBuffer
            long t1= System.currentTimeMillis();
            StringBuffer buffer =new StringBuffer("abc");        
            for (int i = 0; i < 100000; i++) {
                buffer.append("xxx");
            }
            long t2=System.currentTimeMillis();
            long t=t2-t1;
            System.out.println(t);//4
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    1.2 常用方法

    append()在当前StringBUffer对象上,追加其他内容
    capacity()返回当前StringBuffer的容量
    length()返回长度
    setCharAt(int,char)将给定索引位置的字符设置为第二个参数给定的值
    reverse()将StringBuffer内容反转
    delete(int,int)删除在StringBuffer中从指定索引开始(包含)到结束(不包含)的字符串
    toString()将StringBuffer转成字符串
    insert(int,Object)在指定索引位置,插入给定值
    replace(int,int,String)将指定的字符串替换到起始(包含)位置和结束(不包含)位置中
    deleteCharAt(int)删除指定索引位置的字符
    public class TestStringBuffer_1 {
        public static void main(String[] args) {
           StringBuffer buffer=new StringBuffer();
            System.out.println(buffer.capacity());//16
    
            StringBuffer buffer=new StringBuffer("abc");
            System.out.println(buffer.capacity());//19
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    上述程序结果不同的原因:
    在这里插入图片描述

    案例:判断从键盘接收一行文字,是否是回文 例如:abcba

    Scanner scanner=new Scanner(System.in);
    System.out.println("请输入一行文字:");
    String str=scanner.next();
    StringBuffer buffer=new StringBuffer(str);
    buffer.reverse();
    //boolean b=str.equals(buffer);//false  因为在调用String的equals方法时,要求必须是String类型才可以,str是String类型,而buffer是StringBuffer类型。
    
    //解决办法一:把StringBuffer调用toString方法转成String类型
    boolean b=str.equals(buffer.toString());
    
    //解决办法二:调用contentEquals方法
    boolean b=str.contentEquals(buffer);
    System.out.println(b);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    StringBuffer buffer=new StringBuffer("abcdef");
    //delete(int,int):删除在StringBuffer中从指定索引开始(包含)到结束(不包含)的字符串
    buffer.delete(0,3);
    System.out.println(buffer);//def
    //insert(int,Object):在指定索引位置,插入给定值
    buffer.insert(0,"XXX");
    System.out.println(buffer);//XXXdef
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    StringBuffer buffer=new StringBuffer("13566667777");
    //replace(int,int,String):将指定的字符串替换到起始(包含)位置和结束(不包含)位置中
    buffer.replace(3,7,"****");
    System.out.println(buffer);//135****7777
    //deleteCharAt(int):删除指定索引位置的字符
    buffer.deleteCharAt(0);
    System.out.println(buffer);//35****7777
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.StringBuilder

    • 提供了和StringBuffer相同的API

    • StringBuffer的方法,都有synchronized修饰,是线程安全的

    • StringBuild的方法,没有synchronized修饰,非线程安全的。如果是单线程操作字符串相关处理,StringBuilder的效率最高。

    3.String、StringBuffer、StringBuilder的区别

    • String和StringBuffer的区别: 一个是常量,一个是变量。String是一个final修饰的终结类,不能产生子类,是使用final的byte数组来存储值,所以一旦创建不能改变。如果疆场对字符串进行修改、删除或者插入操作,建议使用StringBuffer效率更高

    • StringBuffer和StringBuilder的区别: 一个是有线程安全的,一个是非线程安全的

  • 相关阅读:
    stable diffusion 的controlNet 安装和使用
    嵌入式复习题部分(一)
    后端接口的查询方式
    1panel + Pbootcms 设置伪静态规则
    【工程光学】典型光学系统
    geecg-uniapp 同源策略 数据请求 获取后台数据 进行页面渲染 ui库安装 冲突解决(3)
    快速筛选打卡时间日期等数据:EXCEL筛选查找某一时间点是否在某一时间段内
    单例模式实现及防止反射与序列化
    YOLO-World: Real-Time Open-Vocabulary Object Detection
    使用Go构建一个Postgres流平台
  • 原文地址:https://blog.csdn.net/qq_41994691/article/details/134517602