StringBuilder的底层存储原理

#自己的一些理解并参考了一些百度文献

1.StringBuilder是什么?

2.StringBuilder的底层存储原理

3.StringBuilder与StringBuffer的区别是什么?

StringBuilder是什么?

关于StringBuilder,继承自AbstractStringBilder,它是一个可变字符串类,又叫字符串缓冲区。与String类类似,它们都能对字符串进行操作。但不同的是,String类的底层存储原理是一个被final修饰的char型数组,所以String类的对象被操作后都会创建新的对象。而StringBuilder的底层存储虽然也为char型数组,但它没被final修饰,即它是可变的,这也是它被称为可变数组的原因。

StringBuilder的底层存储原理

在StringBuilder类中有几个成员变量

1.char[] value :表示底层存储的字符型数组

2.int count:表示在value数组中被占用的长度,与String类不同,Stringbuilder的存储数组中并不是全部被占用的。

在StringBuilder类中有几个构造方法

1.无参构造

使用此无参构造方法初始化StringBuilder的对象,表示初始化储存数组的容量为16,在底层存储时使用append方法将要储存的对象内容追加到StringBuilder实例化的对象内容后面(此时内容为空),另外在使用append方法之前会先进行判断要追加的内容是否超过了初始化数组的容量

如果要储存的内容超过了初始化数组value的长度,则需要进行扩容,具体代码原理如下:

即将原初始化数组的长度*2再+2,再判断扩容之后的数组容量newCapacity是否仍然小于要存储的对象内容的最小容量minCapacity,如果是,则将要储存对象内容的容量赋值给扩容之后的数组容量,否则判断扩容之后的数组容量是否小于等于0或者大于MAX_ARRAY_SIZE(数组最大容量),如果不是则扩容后的容量即为初始化数组的容量。

2.参数为int型capacity的有参构造

调用此构造方法,可根据具体的参数初始化字符数组value的容量,即可自定义初始化字符数组value的容量。

3.参数为String型str的有参构造

调用此构造方法,初始化数组value的容量为参数str的长度+16.,并在原StringBuilder实例化对象的内容后面调用append方法追加参数str的内容。

4.参数为CharSequence型 seq的有参构造

调用此构造方法与上面类似,初始化数组value的容量为参数seq的长度+16.,并在原StringBuilder实例化对象的内容后面调用append方法追加参数seq的内容。(此处有所疑问,Charsequence为接口类型,如何实例化对象seq呢???)

StringBuilder与StringBuffer的区别是什么?

1.StringBuilder与StringBuffer都是可变字符串类,并且有着相同的继承,实现关系。

2.StringBuilder与StringBuffer创建的版本不同

  StringBuffer创建于jdk1.0版本,而StringBuilder创建于较晚的jdk1.5版本。

3.StringBuilder与StringBuffer的使用领域不同

由于StringBuffer对方法或者调用的方法加了synchronized同步锁,所以线程相对安全,因此多应用于多线程。而StringBuilder没有加同步锁,线程相对没有那么安全,因此多应用于单线程。

4.StringBuilder与StringBuffer的性能不同

由于StringBuffer加了同步锁的缘故,性能比起StringBuilder要差一些。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值