- StringBulider和StringBuffer介绍
- 研读StringBuilder源码
- 研读StringBuffer源码
- StringBuilder StringBuffer String区别
- StringBulider和StringBuffer介绍
-
如果说String 是长度固定不变且不能修改的字符串,SB就是长度可以可变内容可以修改的字符串,两者的方法方法都是一样的,唯一的区别就是:
适用的场景不同,StringBuffer适用于多线程,StringBuilder适用于单线程,StringBuilder是线程不安全的-->没加锁(同步锁)-->效率高
StringBuffer是线程安全的-->加锁(同步锁)-->多线程-->效率低
研读StringBuilder源码
- 父类是AbstractStringBuilder,这个父类有同时实现了java.io.Serializable, CharSequence这两个接口
java中的StringBuilder类和StringBuffer类 现在我们来看下StringBuilder,我们挑选其中的几个方法说活
就这个append()方法,
它的这个return append(String.valueOf(obj));中的append()方法是调用本类中的java中的StringBuilder类和StringBuffer类 这个方法,那么这个return append(String.valueOf(obj));中的String.valueOf()这个方法又是调用String类中的toString()方法,返回的是一个字符串,传入到这个StringBuilder append方法中,然后这个方法又通过super调用父类的append方法java中的StringBuilder类和StringBuffer类 这个方法再把传入的字符串,通过调用ensureCapacity()这个方法java中的StringBuilder类和StringBuffer类 此方法又调用expandCapacity()这个方法java中的StringBuilder类和StringBuffer类 java中的StringBuilder类和StringBuffer类 经过判断,最后返回一个StringBuilder对象
通过查找API,这边做了一个测试的demo
研读StringBuffer类 --------->方法基本和StringBuilder类似package SB; import test.Person; public class StringBuilderDemo01 { public static void main(String[] args) { // TODO Auto-generated method stub StringBuilder sb=new StringBuilder(); /** * Person p=new Person("张三",16); sb.append(p); sb.append("123"); sb.append(true); System.out.println(sb.capacity()); sb.delete(1,3);//[1,3) System.out.println(sb); */ int [] arr= {1,2,3,5,67,8,98}; System.out.println(strArr(arr,sb)); } public static String strArr(int [] arr,StringBuilder sb) { if (arr==null) { return null; } sb.append("["); for(int i=0;i<arr.length;i++) { sb.append(arr[i]); if(i==arr.length-1) { return sb.append("]").toString(); } else { sb.append(","); } } return null; } }
- StringBuilder StringBuffer String区别
|StringBuilder 有final表示不能被继承 成员函数没有synchronized修饰 无同步锁
|impl Serializable
|impl CharSequence
|StringBuffer 有final表示不能被继承 成员函数都有synchronized修饰 同步锁
|impl Serializable
|impl CharSequence
String 有final表示不能被继承 线程不安全的 会产生额外的垃圾!
|impl Serializable
|impl Comparable
|impl CharSequence
字符串缓冲区SB其实就是个动态扩容的数组而已!
如果扩容的次数越多,那么也就意味着所用过的数组也越多 产生的垃圾越多!
我们在使用String去操作的话,也会产生许多临时的字符串 产生的垃圾也多!
咋整?
SB产生的垃圾主要集中在 堆内存
String产生的垃圾主要集中在 方法区(字符串常量池)
【JVM告诉你,GC在堆内存中活跃程度 比在方法区的活跃程度 要大的大的大的多!】
【GC 垃圾收集器】
【也就意味着 GC在堆内存中回收垃圾的效率要远远比在方法区高】
(堆垃圾就像是家用垃圾桶,满了就清理)
(方法区就像是垃圾场,满了才清理)
【堆的垃圾被回收的很快 方法区的垃圾回收的很慢】
综上而言 还是推荐使用SB