Java中String,String Buffer,StringBuilder三者区别(源码上分析)

1.String类的部分源码

从以上代码可知String类实现了三个接口

1.Java.io.Serializable:可以实现序列化和反序列化

2.Comparable<String>:可以进行比较,可与之比较的对象为指定的泛型-String

3.CharSequence:是一个char型的队列

也可以看出String类有三个私有属性

1.char[]  value : char数组用来存放字符串的值

2.int  hash : 用来存放字符串的散列值(在存储优化时有用)
3.long serialVersionUID : 是该类的序列化版本(序列化的时候系统会把当前类的serialVersionUID写入到序列化文件中,反序列化是系统会检查serialVersionUID,若是两者一致,则说明序列化类的版本和当前类的版本一致,可以成功反序列化,否侧失败报错,报InvaildCastException)

关键点:由于String底层存储字符串的方式是以一个char[] 存放,数组一经实例化后是定长,所以String类型的字符串一旦实例化后不可改变,看下面三行代码

        String a = "a";
        a = a+"s";
		System.out.println(a); // 结果是as

虽然打印的结果是as,但是在内存中"a"的对象没有改变,之所以能打印出as是因为在内存中为a+"s"重新分配空间,并将新的空间地址指向a;倘若程序中要求字符串频繁的变动,每一次变动都会开销新的内存空间,会造成很大的资源空间浪费

2.StringBuffer类的部分源码

StringBuffer类不同于String的地方首先在于它继承了一个AbstractStringBuilder类,当然作为同样可变长字符串的StringBuilder也继承了AbstractStringBuilder这个类,他们之所以可变长就是因为这个所继承的这个类的一个很重要的方法:

这里详细解释一下这个方法,这个方法返回一个int型值,这个值的作用是来确定存放字符串数组的容量(字符串数组的容量和字符串的长度的关系是,长度小于等于容量),newCapacity(新容量)的值是char[]型数组value的长度的2倍再加2,如果容量比最小容量小,那么就把最小容量赋予新容量,最后通过三目运算判断如果新容量小于0或者新容量大于可存储的最大数组长度,则返回hugeCapacity(minCapacity)的值,否则返回新容量;hugeCapacity(minCapacity)方法会先通过minCapacity与Interger.MAX_VALUE比较,如果minCapacity大于Interger.MAX_VALUE的话,报内存溢出异常,不大于的话会在进行minCapacity与MAX_ARRAY_SIZE的比较,返回两者之间的最大值;

简单的来说就是,你给我一个字符串,StringBuffer类的对象在实例化的时候如果会有一个存储数组容量判断(如果没有指定,系统初始化为16个字节),当字符串的长度大于存储数组的容量时,将存储数组的容量扩充为字符串长度的二倍再加2;

没有指定容量的时候:一个字符串长度为10个字节,小于初始容量16,不做任何修改;另一个字符串长度为20,大于初始容量,所以将存储数组的容量扩充为20*2+2 =42;

在指定容量的时候,字符串和指定容量进行对比,然后再进行扩充或者不扩充

3.StringBuilder

StringBuilder与StringBuffer功能相似,不同点在于StringBuffer内部进行了多线程安全的考虑,再多线程运行时无需对它进行额外的线程安全考虑,StringBuilder则没有这个功能,因为StringBuffer内部进行了多线程安全的保证,所以StringBuffer的运行速度药慢于StringBuilder,StringBuilder的存在也是为了在单线程任务中提高运行效率

 

ps:以上就是个人对于String,StringBuffer,StringBuilder的理解,查看了很多底层的代码,若有理解错误的地方,请各位兄dei不吝指教,也欢迎各位一起探讨更多的java知识,一起学习,我QQ:564769300

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值