浅谈StringBuffer类

String对象一旦建立,就不能在堆内存中更改。重新赋值只能改变变量名的指向,比如:

String str = "abc"; //堆内存中开辟空间,存入abc
str = “def”; //另开辟空间存入def,并改变str的指向,原先内存中的abc并没有消失

当指向字符串的变量更改指向之后,原先的字符串在内存中就成了“垃圾”,就会有垃圾回收机制,定期地回收内存。

但是,如果需要对字符串变量频繁的操作,就会产生大量的内存空间垃圾。为了避免这种情况,在需要对字符串进行频繁操作的时候,就可以使用StringBuffer对象。StringBuffer对象可以直接操作堆内存中的字符串,从而避免产生大量的内存垃圾。

StringBuffer类的声明:

StringBuffer objectName; 

StringBuffer对象的创建:

  1. 无参构造方法:无参构造方法创建一个可容纳16个字符的StringBuffer对象
StringBuffer sb = new StringBuffer();
  1. 整型参数构造方法:创建一个可容纳参数长度字符的StringBuffer对象
StringBuffer sb = new StringBuffer(101); //创建一个可容纳101个字符的字符串
  1. 以String对象作为参数的构造方法:可容纳长度为参数字符串长度,再加16 个字符
StringBuffer sb = new StringBuffer("abcde");

浅谈StringBuffer类初始容量及扩容


StringBuffer类可以创建可修改的字符串序列。该类有StringBuffer(),StringBuffer(int size),StringBuffer(String s)三个改造方法。

1.StringBuffer()的初始容量可以容纳16个字符,当该对象的实体存放的字符的长度大于16时,实体容量就自动增加。StringBuffer对象可以通过length()方法获取实体中存放的字符序列长度,通过capacity()方法来获取当前实体的实际容量。

2.StringBuffer(int size)可以指定分配给该对象的实体的初始容量参数为参数size指定的字符个数。当该对象的实体存放的字符序列的长度大于size个字符时,实体的容量就自动的增加。以便存放所增加的字符。

3.StringBuffer(String s)可以指定给对象的实体的初始容量为参数字符串s的长度额外再加16个字符。当该对象的实体存放的字符序列长度大于size个字符时,实体的容量自动的增加,以便存放所增加的字符。

接下来介绍StringBuffer()怎样扩容:

首先我们需要知道StringBuffer和StringBuilder类都继承了抽象类AbstractStringBuilder类;

源码都调用父类来进行初始化:
在这里插入图片描述

StringBuffer(String s)的初始化:

在这里插入图片描述

扩容算法:
使用append()方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就需要进行扩容:构建新的存储空间更大的字符串,将久的复制过去;

再进行字符串append添加的时候,会先计算添加后字符串大小,传入一个方法:ensureCapacityInternal 这个方法进行是否扩容的判断,需要扩容就调用expandCapacity方法进行扩容:
在这里插入图片描述

尝试将新容量扩为大小变成2倍+2 if 判断一下 容量如果不够,直接扩充到需要的容量大小。

转载于:https://www.cnblogs.com/modu/p/8027568.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值