java中的StringBuilder类和StringBuffer类

 

  • StringBulider和StringBuffer介绍
  • 研读StringBuilder源码
  • 研读StringBuffer源码
  • StringBuilder StringBuffer String区别
  1. StringBulider和StringBuffer介绍
  2. 如果说String 是长度固定不变且不能修改的字符串,SB就是长度可以可变内容可以修改的字符串,两者的方法方法都是一样的,唯一的区别就是:
    适用的场景不同,StringBuffer适用于多线程,StringBuilder适用于单线程,StringBuilder是线程不安全的-->没加锁(同步锁)-->效率高

    StringBuffer是线程安全的-->加锁(同步锁)-->多线程-->效率低

     研读StringBuilder源码
  3. 父类是AbstractStringBuilder,这个父类有同时实现了java.io.Serializable, CharSequence这两个接口

         现在我们来看下StringBuilder,我们挑选其中的几个方法说活

    就这个append()方法,

    它的这个return append(String.valueOf(obj));中的append()方法是调用本类中的

    这个方法,那么这个return append(String.valueOf(obj));中的String.valueOf()这个方法又是调用String类中的toString()方法,返回的是一个字符串,传入到这个StringBuilder append方法中,然后这个方法又通过super调用父类的append方法

    这个方法再把传入的字符串,通过调用ensureCapacity()这个方法

    此方法又调用expandCapacity()这个方法

    经过判断,最后返回一个StringBuilder对象

    通过查找API,这边做了一个测试的demo

    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;
    	}
    
    }
    
             研读StringBuffer类 --------->方法基本和StringBuilder类似
  4. 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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值