String、StringBuffer、StringBuilder三者比较

时间:2021-05-05 03:56:49

相同点:都与字符串操作相关(都实现implements  CharSequence),底层都是char [ ] 存放数据的。

String:不可变字符序列;

StringBuffer:可变字符序列;线程安全的,效率低;

StringBuilder:可变字符序列;线程不安全的,效率高(jdk5.0新增);


String的不可变性表现为:①在现在字符串后增加字符串,在常量池中重新创建新的字符串。

                                        ②修改现有字符串,在常量池中重新传建新的字符串。

        String str = new String("abc"); //  new char [ ] {'a','b','c'}.定长的数组。

String 源码:String、StringBuffer、StringBuilder三者比较

String的不可变性原因:底层代码中定义的 char [ ] 数组是用 final修饰的。

StringBuffer/StringBuilder可变原因是:二者均继承(extends )AbstractStringBuilder,AbstractStringBuilder定义的char [ ] 无修饰符。

        StringBuffer sb1 = new StringBuffer ( );  // new char [16 ] 默认调用父类的有参构造,参数是16

        sb1.length(); //0

        sb1.append("a"); // char[0] = 'a'

        sb1.append("b"); // char[0] = 'b'

       .......

       有可能超出底层数据的范围:涉及扩容的问题(在AbstractStringBuilder中实现)。容量到不够的时候才去扩容。

默认int newCapacity = value.length * 2 + 2;

扩容完数据复制:value = Arrays.copyOf(value, newCapacity);

开发建议:在已知字符串长度时,定义直接指定数组长度。

源码部分展示:

AbstractStringBuilder

String、StringBuffer、StringBuilder三者比较

StringBuilder

String、StringBuffer、StringBuilder三者比较String、StringBuffer、StringBuilder三者比较

StringBuffer

String、StringBuffer、StringBuilder三者比较

String、StringBuffer、StringBuilder三者比较