- 透彻分析String、StringBuilder和StringB
- <--个人成长笔记系列-->知识点解析之synchronized
- 《Java编程的逻辑》笔记30--剖析StringBuilder
- 018:String、StringBuilder和StringB
- 经历了三轮面试,拿到的华胜天成Java面试真题
- 第五章、String,StringBuilder,StringB
- StringBuilder和StringBuffer区别以及原理
- 一文搞懂String 、CharSequence、StringB
- 日常记忆之Java StringBuffer和StringBui
- String、StringBuffer 和 StringBuil
StringBuilder与String的性能对比
在名企面试官面前,如果仅仅回答“String不可变、StringBuilder可变、String不可被继承”等等卖萌的答案,只能等着被pass!
StringBuilder.apend源码分析
先来看一段代码
输出结果
可以看出当进行大量的字符串拼接操作时,StringBuilder的append()方法比String的“+”快50倍以上!
我们来看一下它的源码调用过程:
首先会调用:StringBuilder append方法
然后调用父类的AbstractStringBuilder append
在该方法中有一个value属性值,是一个char类型的数组。
if (newCount > value.length)
expandCapacity(newCount);
当新的容量大于原来的容量时就进行扩容操作:
其中会调用Arrays.copyOf方法,把老的数组copy到新创建的数组(长度为原来的2n+2倍)中去
然后返回给原来的数组。然后把value引用指向新的数组。
扩容操作完成后返回AbstractStringBuilder append方法,执行
str.getChars(0, len, value, count)
方法,该方法的作用是把字符串拷贝到stringbuilder本身的char数组当中去,如果不需要扩容则直接执行这个方法。
综上可以得到调用StringBuilder调用append方法的流程为:
所以附加以下“面向对象”的回答,会更加出彩:
StringBuilder是抽象类AbstractStringBuilder的一个具体实现
StringBuilder与AbstractStringBuilder重载了不同的append()方法
所有的append()方法都会返回this,这样就实现了链式编程
其他细节:
执行流程
当数组容量不够的时候,会调用AbstractStringBuilder的expandCapacity()方法,将数组的容量扩大至原来的2n+2;
其中,expandCapacity()又调用了Arrays的copyOf()方法,目的是把原来数组的元素拷贝至新的数组。
String+"H"分析
概括一下整个过程:
- 新开辟一个length+1的数组
- 把原来的数组复制过来
- 在数组尾部再复制一个H
- 把原来value引用指向新的数组,旧数组会被GC回收器回收
同StringBuilder的append(),假设执行了65535次“+”,即:n=65535;那么,一共进行了多少次新对象、新数组的开辟,以及旧对象、旧数组的释放?
每次“+”,要new StringBuilder(),一共n次
每次“+”,要new char[str.length()+1],一共n次
故而,进行了2n次的开辟和释放。
String+ 和StringBuilder对比
网友评论