[Java学习笔记]StringBuilder/StringBuffer类

一、StringBuilder——可变字符串

    StringBuilder是一个继承了AbstractStringBuilder的实现类    又称可变字符串

属性:byte[] value(非final修饰)
               int count; (此时计数器)

构造器:实际上都用的是父类内的构造方法!
                     StringBuilder(int)        调用父类方法,传入的是一个Capacity也即核心value的长度
                    StringBuilder()            同上,只不过默认传入Capacity=16
                    StringBuilder(String)    仍然同上,传入的虽然是字符串但实际调用过程中是传入父类构造器 
                                                        一个String的长度+16这样的Capacity

方法:主要是append!
                 StringBuilder与String最大的区别阅读源码我们会发现在于它的方法往往return this 
                 也就是说它是直接修改本对象并返回的(基于的是内部value[]数组并不是由final限制的,可修改)
                 而String内部方法如substring、split、concat等都是返回一个新String对象!
                 也就是说效率上有很大区别
                 append(Object/String/int/double/boolean......)
                 基本上来说大同小异,无非是将非String类型的采用String.valueOf(xxx)转化成String
                再调用父类的append方法:ensureCapacityInternal(count+str.length())确保capacity够用
                 最后完成在尾部补充新加str的操作并返回本对象;
                 亮点在于他能够实现链式增添 append(xx).append(yy).append(zz).......
                再者 当需要多次添加重复的对象有且仅有当前Stringbuilder对象和新对象二者!
                换用String则要反复新建对象反复清除旧对象 效率低!

 

            

        StringBuilder	sbd = new StringBuilder("HelloWorld");
		sbd.insert(3,"Q" ).insert(3, "P");
		System.out.println(""+sbd);//	HelPQloWorld
		sbd.delete(0, 2);//往往角标问题是包头去尾
		System.out.println(sbd);//	lPQloWorld
		sbd.replace(0, 3, "Hel");//HelloWorld
		System.out.println(sbd);
		sbd.replace(0, 3, "Hello");//HelloloWorld
		System.out.println(sbd);

二、StringBuffer

StringBuffer在方法功能和方法实现上基本与StringBuilder一致,但它的特点在于它的方法都加上了Synchronized以添加同步锁机制,确保字符串操作的过程中多线程和谐并发,防止资源抢夺中发生不合法的逻辑!

三、效率比较

        String str = "";
		StringBuilder sb1 = new StringBuilder();
		StringBuffer sb2 = new StringBuffer();
		long start = System.currentTimeMillis();
		for(int i = 0 ; i < 100000 ; i ++)
		{
			str += i;
		}
		long end1 = System.currentTimeMillis();

//		Time of String : 13823ms
		System.out.println("Time of String : "+ (end1 - start)+"ms");
		
		for(int i = 0 ; i < 100000 ; i ++)
		{
			sb1.append(i);
		}
		long end2 = System.currentTimeMillis();

//		Time of Builder : 3ms
		System.out.println("Time of Builder : "+(end2 - end1)+"ms");
		
		for(int i = 0 ; i < 100000 ; i ++)
		{
			sb2.append(i);
		}
		long end3 = System.currentTimeMillis();

//		Time of Buffer : 6ms
		System.out.println("Time of Buffer : "+(end3 - end2)+"ms");

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值