Java中String和StringBuffer、StringBuilder的区别是什么?(附详细讲解)

  • .String、StringBuffer 和StringBuilder的比较

1) StringBuilder 和 StringBuffer非常类似,均代表可变的字符序列,而且方法也一样

2) String:不可变字符序列,效率低,但是复用率高。

3) StringBuffer:可变字符序列、效率较高(增删)、线程安全,看源码(加锁)

4) StringBuilder:可变字符序列、效率最高、线程不安全

5)String使用说明:

        String s = “a”; //创建了一个字符

        s +=“b”; //实际上原来的"a"字符串已经丢弃了,现在有产生一个字符串 s+“b”(也就是"ab"),如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能。

        结论=>如果我们对String做大量的修改,不要使用String。

  • 使用的原则,结论:

1.如果字符串存在大量的修改操作,一般使用StringBuffer 或StringBuilder

2.   如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder

3.如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer

4.如果我们字符串很少修改,被多个对象引用,使用String, L比如配置信息等

效率 : StringBuilder > StringBuffer > String(代码演示在最后)

  • StringBuffer

1.StringBuffer的直接父类是AbstractStringBuilder

2.StringBuffer实现了Serializable 即StringBuffer的对象可以串行化

3.在父类中 AbstractStringBuilder 有属性 char[] value,不是final,在该value数组存放字符串内容,引出存放在堆中的

4.StringBuffer 是一个final类 不能被继承

5.StringBuffer是存放在 char[] value ,所有的变化 不用每次创建新对象,更换地址所以效率高于String
StringBuffer 构造器默认为初始化16个字符

StringBuffer的构造器 

public class StringBuffer02 {
    public static void main(String[] args) {
        //构造器的使用
        //1.创建一个大小为16的 char[],用于存放字符内容
        StringBuffer stringBuffer1 = new StringBuffer();
        //2.通过构造器指定char[]大小
        StringBuffer stringBuffer2 = new StringBuffer(100); //cahr[100]
        //3. 通过 给一个String 创建一个 StringBuffer,char[] 大小就是str.length() +16
        StringBuffer stringBuffer3 = new StringBuffer("hello");
    }
}

String和StringBuffer相互转换

public class StringAndStringBuffer {
    public static void main(String[] args) {
        //看String——>StringBuffer
        String str = "hello Tom";
        //方式一,使用构造器
        //注意:返回的才是 StringBuffer 对象,对str 本身没有影响
        StringBuffer stringBuffer = new StringBuffer(str);
        //方式2使用的是append方法
        StringBuffer stringBuffer1 = new StringBuffer();
        stringBuffer1 = stringBuffer.append(str);

        //看看 StringBuffer-->String
        StringBuffer stringBuffer2 = new StringBuffer("hsp");
        //方式一:使用 StringBuffer 提供的 toString方法
        String s = stringBuffer2.toString();

        //方式二:使用构造器
        String s1 = new String(stringBuffer2);
    }
}

常用方法

1)增append
2)删delete(start,end)
3)改replace(start,end,string)//将start----end间的内容替换掉,不含end
4)查indexOf //查找子串在字符串第1次出现的索引,如果找不到返回-1

5)插insert
6)获取长度length

代码演示

public class StringBufferMethod01 {
    public static void main(String[] args) {
        StringBuffer s = new StringBuffer("hello");
        //1.增
        s.append(',');// "hello,"
        s.append("张三丰");//"hello,张三丰
        s.append("赵敏").append(100).append(true).append(10.5);//"hello,张三丰赵敏 100true10.5"
        s.append("你好").append("world").append(100.2);
        System.out.println(s); //"hello,张三丰赵敏 100true10.5

        //2.删
        /*
        * 删除索引为>=start && <end 处的字符
        * 解读: 删除 11~14 的字符 [11, 14)  左闭右开
        */
        s.delete(11,14);
        System.out.println(s); //hello,张三丰赵敏100t10.5你好world100.2
        s.delete(0,10);
        System.out.println(s);//敏100t10.5你好world100.2
        //3.改
        // 老韩解读,使用 周芷若 替换 索引 9-11 的字符 [9,11)
        s.replace(9,11,"周芷若");
        System.out.println(s);//敏true10.5周芷若world100.2

        //4.查找指定的子串在字符串第一次出现的索引,如果找不到返回-1
        int indexOf = s.indexOf("周芷若");
        System.out.println(indexOf); //9
        //5.插入
        //老韩解读,在索引为 9 的位置插入 "赵敏",原来索引为 9 的内容自动后移
        s.insert(9,"周敏");
        System.out.println(s);//敏true10.5周敏周芷若world100.2
    }
}
  •  StringBuilder类

1)一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作 StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类因为在大多数实现中,它比 StringBuffer要快。
2)在 StringBuilder上的主要操作是append和 insert方法,可重载这些方法,以接受任意类型的数据。

常用方法同上,这里不再演示。

三者性能比较代码:

public class StringVsStringBufferVsStringBuilder {
    public static void main(String[] args) {
        long startTime = 0L;
        long endTime = 0L;

        //StringBuffer
        StringBuffer buffer = new StringBuffer("");
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 80000; i++) {//StringBuffer 拼接 20000 次
            buffer.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuffer 的执行时间:" + (endTime - startTime));

        //StringBuilder
        StringBuilder builder = new StringBuilder("");
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 80000; i++) {//StringBuilder 拼接 20000 次 第 566页
            builder.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder 的执行时间:" + (endTime - startTime));

        //String
        String text = "";
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 80000; i++) {//String 拼接 20000
            text = text + i;
        }
        endTime = System.currentTimeMillis();
        System.out.println("String 的执行时间:" + (endTime - startTime));
    }
}

运行结果: 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值