解析 : String、StringBuffer、StringBuilder

本文详细介绍了Java中的StringBuffer类,包括其特性、常用方法以及与String和StringBuilder的区别。StringBuffer线程安全,适用于多线程环境,而StringBuilder效率更高,适合单线程。此外,还提供了转换方法和示例代码,展示了如何在不同场景下使用这两个类进行字符串操作。
摘要由CSDN通过智能技术生成

StringBuffer

  • StringBuffer 的直接父类位AbstracStringBuilder;AbstracStringBuilder实现了 Srrializable,即String Buffer的对象可以串行化
  • 再父类中AbstracStringBuilder 有属性 cahr[] value ,不是final该value数组存放字符串内容,引出存放再堆中的
  • StringBuffer是一个final类,不能被继承
  • 因为StringBuffer而字符串内容是存在char[] value ,所有再变化(增加、删除) 不用每次更换地址,(每次不是创建新的对象)所以效率高于String
  • 初始化的时候如果没有指定空间,默认是16
  • 新加入的字符都是存在value byte[]下标位
    • 当存储的字符数量超过了初始容量,自动扩容

String 与 StringBuffer

  • String保存的是字符串常量,里面的值是不能更改的,每次Sring类的更新更新的实际上是更改地址,效率较低(private final char value[];)
  • StringBuffer 保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新时间上更新的是内容,不用每次更新地址,效率较高(char [] vlaue)

String与 StringBuffer的相互转化

  • String --> StringBuffer

    // 1. 使用构造器,本身对String s1 并没有影响

    String s1 = ‘hello’;

    StringBuffer s2 = new StringBuffer(s1);

    // 2 .append方法

    StringBuffer s3 = new StringBuffer(0);

    s3 = s3.append(s1);

  • StringBuffer 转 String

    1. toString方法

    StringBuffer s1 = new StringBuffer(“hello”);

    String s2= s1.toString();

    1. new String

    String s3 = new String (s1);

StringBuffer 的常见方法

public class Test {
    public static void main(String[] args) {
        //StringBuffer 的基本使用
        StringBuffer stringBuffer = new StringBuffer("hello");
//        增
        stringBuffer.append(",");  //hello,
        stringBuffer.append("李森与gs的奋斗人生,hasugfhisa的撒火凤凰iuhf,啊速度回复");
//        查
        int index = stringBuffer.indexOf("ha");//14,查找的是第一位h的位置,从0开始
        int index1 = stringBuffer.indexOf("复");//38
        System.out.println(index);
//        删
        stringBuffer.delete(16,43); // 删除 字符 [16,43)
        System.out.println(stringBuffer); //李森的奋斗人生
//        改
        stringBuffer.replace(9,11,"高森");  //使用 高森替换 [9,11)字符
        System.out.println(stringBuffer);
//        长度
        System.out.println(stringBuffer.length());
        System.out.println(stringBuffer.indexOf("生")); // 字符位置:16
//        插入
        stringBuffer.insert(16,",一定幸福呀!"); //在字符16的位置插入后面的内容
        System.out.println(stringBuffer);
    }
}

练习

  • 练习1
        String s = null;
        StringBuffer stringBuffer = new StringBuffer(s);
        System.out.println(stringBuffer);
// 结果: NULLPointException 空指针异常 
  • 练习2
        String s = null;
        StringBuffer s1 = new StringBuffer();
        s1.append(s);
        System.out.println(s1.length());
//        结果为 4
  • 练习3
//        要求:输入一串数字,1214516134.109458,打印1,214,516,134.109458
// 		  思路: 找到. 的位置,在该位置的前三位数前面insert , 即可,这里判断了两种情况,有无. 
        String s = "1214516134109458";
        StringBuffer sb = new StringBuffer(s);
        int index = -1;
        index = sb.indexOf(".");
        if(index>0){
            for(int j= sb.indexOf(".")-3;j>0;j-=3) {
                sb.insert(j,",");
            }
        }
        else {
            for(int j= sb.length()-3;j>0;j-=3) {
                sb.insert(j,",");
            }
        }
        System.out.println(sb);
    }

StringBulider

  • 一个可变的字符序列。 此类提供一个与String Buffer兼容的API,但不保证同步(StringBuilder 不是线程安全)。该类被设计作用String Buffer的一个简单替换,用在字符串缓冲区被单个线程使用的时候。(单线程,不安全)
  • 主要操作是append 和 insert (增加和指定位置插入)

String 、 StringBuilder、 StringBuffer 三者之间的比较

  1. StringBuilder、 StringBuffer非常相似,均代表科比那字符序列,而且方法也一样
  2. String: 不可变字符序列,效率低,但是复用性高
  3. StringBuffer:可变字符序列,效率较高(增删)、线程安全
  4. StringBuilder:可变字符序列,效率最高、线程不安全
  5. String的使用: String s = “a”; // 创建了一个字符 String s += “b”; //实际上a字符串已经丢弃,又产生了字符串s+“b”(ab)。多次使用会导致大量副本字符串对象存留在内存中,侠侣降低;结论:如果我们对String大量修改,不要使用String
  6. 对 String 大量修改:多线程使用StringBuffer ,单线程使用StringBuilder
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值