WHWW之String,StringBuffer,StringBuilder

What:String,StringBuffer,StringBuilder之间区别是什么?

String 是不可变的字符串,线程安全的

StringBuffer 是可变的字符串,线程安全的

StringBuilder是可变的字符串,线程不安全的。

在大部分情况下,字符串拼接速度为:StringBuilder>StringBuffer>String

How:怎么实现呢?

public class Test1 {

    public static void main(String[] args) {
        String string="String";

        StringBuffer stringBuffer=new StringBuffer();
        stringBuffer.append(string+"Buffer");

        StringBuilder stringBuilder=new StringBuilder();
        stringBuilder.append(string+"Builder");

        System.out.println("String:"+string);
        System.out.println("StringBuffer:"+stringBuffer);
        System.out.println("StringBuilder:"+stringBuilder);

    }
}

 How:怎么去选择使用String,StringBuffer,StringBuilder?

1.如果要操作少量的数据用 String

2.单线程操作字符串缓冲区 下操作大量数据  StringBuilder

3.多线程操作字符串缓冲区 下操作大量数据 StringBuffer

Why:既然有了String,为什么要引入StringBuffer和StringBuilder?

要提高字符串拼接速度:因为字符串拼接速度为:StringBuilder>StringBuffer>String

Why:为什么字符串拼接速度为:StringBuilder>StringBuffer>String?

因为String是不可变的,因此每次对其操作改变其变量值时,都是重新生成一个新的对象,只是把变量引用指向了新对象而已,所以速度是比较慢。

对StringBuffer操作其实是直接操作对象指向的引用,不用产生新的对象,速度很快,是线程安全的,但在多线程时,如果要维护多线程的同步的话,那么速度也会变慢。

StringBuilder是jdk5之后新增的,其用法与StringBuffer是一样的,但它是线程不安全的,所以在单线程中,它的速度是最快的。

Why:String 为什么是不可变的?

看String源码可以知道,其实String存值是一个char[]数组,该数组被final修饰并且设置为private。而final修饰的字段是不可变的。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

注:这里说char[]value不可变是指value这个引用不能改变,但数组本身的值是可以改变的

而整个String又被设置为final,所以String是不可变的。

Why:为什么String被设置为final类型?

因为final修饰的类不能被继承,就是要拒绝继承,防止被破坏

why:为什么不要把StringBuffer,StringBuilder应用于HashMap,HashSet?

public class Test2 {
    public static void main(String[] args) {
        HashSet<StringBuffer> hashSet=new HashSet<>();
        StringBuffer stringBuffer=new StringBuffer("String");
        StringBuffer stringBuffer1=new StringBuffer("StringBuffer");
        hashSet.add(stringBuffer);
        hashSet.add(stringBuffer1);
        System.out.println("第一次输出:"+hashSet);
        StringBuffer stringBuffer2=stringBuffer;
        stringBuffer2.append("Builder");
        System.out.println("第二次输出:"+hashSet);
    }
}

测试结果:

这就违反了HashSet的唯一性了。

Where:String,StringBuffer,StringBuilder存放在什么地方?

String是存放在常量池的,在编译期已经被确定了。( 常量池其实也就是一个内存空间,不同于使用new关键字创建的对象所在的堆空间)new String()不是字符串常量哦,它有自己的地址空间,存放在堆( new 的对象,数组都放在堆);StringBuffer,StringBuilder都是存放在堆空间的。

where:String设置为不可变的好处在哪里?

1.因为String是在常量池的,不可变性可以节省内存空间,提升效率

2.就是在多并发情况下,由于不可变性,所以其对象不能被重写,线程安全。

3.就是为了安全

我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。

猜你喜欢

转载自blog.csdn.net/weixin_39220472/article/details/80197658