当前位置: 首页 > article >正文

Java基础-----StringBuffer和StringBuilder

文章目录

  • 1.StringBuffer
    • 1.1 构造方法
    • 1.2 常用方法
  • 2.StringBuilder
  • 3.String、StringBuffer、StringBuilder的区别

1.StringBuffer

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

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
    }
}

比较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 常用方法

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
    }
}

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

案例:判断从键盘接收一行文字,是否是回文 例如: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);
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
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

2.StringBuilder

  • 提供了和StringBuffer相同的API

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

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

3.String、StringBuffer、StringBuilder的区别

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

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


http://www.kler.cn/a/136369.html

相关文章:

  • 概率论与数理统计总复习
  • spark——RDD算子集合
  • Java的 BIO、NIO、AIO?分别的作用和用法
  • 使用vue-pdf预览pdf和解决pdf电子签章显示问题
  • P10424 [蓝桥杯 2024 省 B] 好数
  • 洛谷P1617————数字转英文
  • (十二)Flask重点之session
  • 【练习】检测U盘并自动复制内容到电脑的软件
  • Linux latin1字符集转成UTF-8
  • Vue3中使用Element-Plus分页组件
  • 基于单片机K型热电偶温度采集报警系统
  • 竞赛 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉
  • 2.4 矩阵的运算法则
  • 【机器学习】037_暂退法
  • Redis学习笔记14:基于spring data redis及lua脚本ZSET有序集合实现环形结构案例及lua脚本如何发送到redis服务器
  • 数据结构中树、森林 与 二叉树的转换
  • 比Postman强在哪里
  • PyTorch 实战之水果分类
  • git常用的命令
  • Leetcode hot 100
  • shell 判断文件是否存在(csh bash)
  • 猫12分类:使用多线程爬取图片的Python程序
  • git基本用法和操作
  • Python数据结构——List
  • Python - Wave2lip 环境配置与 Wave2lip x GFP-GAN 实战 [超详细!]
  • PgSQL技术内幕-Bitmap Index Scan