String、StringBuffer和StringBuilder的区别

1.区别:

  • String是不可变类,也就是说,String对象一旦被创建,其值将不能被修改;而其余两个可变。
  • StringBuffer在JDK1.0产生,同步处理,线程安全,效率较低
  • StringBuilder在JDK1.5产生,异步处理,线程不安全,效率较高,当在String中使用“+”来进行字符串连接,编译时会将String类变为StringBuffer类进行apperd( )处理。示例如下:
public class append_Test {
	public static void main(String[] args) {
		String s = "Hello";
		s+=" World";
		s+="!";
		System.out.println(s);//Hello World!
	}
}

以上代码等价于:

//可以作为字符串的拼接方法来使用
public class StringBuffer_Test {
	public static void main(String[] args) {
		String s = "Hello";
		StringBuffer sb = new StringBuffer(s);
		sb.append(" World").append("!");
		System.out.println(sb);//Hello World!
	}
}

2.String与StringBuffer的互相转换

  • String–>StringBuffer:利用StringBuffer的构造方法或append( )方法
  • StringBuffer–>String:调用StringBuffer的toString( )方法

3.StringBuffer的常用操作

3.1 增

@Test
public void test5(){
	StringBuffer buffer = new StringBuffer("abc");
    System.out.println(buffer.append("hello"));//abchello
}

3.2 删

@Test
public void test6(){
	StringBuffer buffer = new StringBuffer("hello");
    System.out.println(buffer.delete(1, 3));//hlo
}

3.3 改

@Test
public void test7(){
	StringBuffer buffer = new StringBuffer("hello");
    buffer.replace(2,4,"cd");
    System.out.println(buffer);//hecdo
}

3.4 查

@Test
public void test8(){
	StringBuffer buffer = new StringBuffer("hello");
    System.out.println(buffer.charAt(3));//l
}

3.5 插入

@Test
public void test9(){
	StringBuffer buffer = new StringBuffer("hello");
    System.out.println(buffer.insert(1, "abc"));//habcello
}

3.6 长度

@Test
public void test10(){
	StringBuffer buffer = new StringBuffer("hello");
    System.out.println(buffer.length());//5
}

4.源码分析【重要】

package String类的使用;

import org.junit.Test;

/**
 * @BelongsProject: untitled
 * @BelongsPackage: String类的使用
 * @Author: mcc
 * @CreateTime: 2020-10-24 08:24
 * @Description:源码分析
 */
public class StringBufferBuilderTest {
    @Test
    public void test1() {
        String str = new String();//char[] value = new char[0];
        String str1 = new String("abc");//char[] value = new char[]{'a','b','c'};

        StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建了一个长度是16的数组
        sb1.append('a');//value[0] = 'a';
        sb1.append('b');//value[1] = 'b';

        StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length()+16]
        //问题1:
        System.out.println(sb2.length());//3,关注不是初始化了多少,而是实际有多少
        //问题2:如果添加的数据底层数组盛不下,该怎么扩容底层的数组
        //默认情况下扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中
        //指导意义:开发中建议使用StringBuffer(int capacity)或StringBuilder(int capacity),避免后续扩容,影响效率
    }
}

5.使用场合

在执行效率方面,StringBuilder最高,StringBuffer次之,String最低,鉴于这一情况,一般而言,如果要操作的数据量比较小,应优先使用String类;如果是在单线程下操作大量数据,应优先使用StringBuilder类;如果是在多线程下操作大量数据,应优先考虑StringBuffer类。

6.效率对比

 @Test
    public void test4() {
        //初始设置
        long startTime = 0L;
        long endTime = 0L;
        String text = "";
        StringBuffer buffer = new StringBuffer("");
        StringBuilder builder = new StringBuilder("");
        //开始对比
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            buffer.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuffer的执行时间:" + (endTime - startTime));

        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            builder.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder的执行时间:" + (endTime - startTime));

        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            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、付费专栏及课程。

余额充值