服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - java中StringBuffer的length()和capacity()方法对比

java中StringBuffer的length()和capacity()方法对比

2021-09-27 10:05石头剪刀布_ Java教程

这篇文章主要介绍了java中StringBuffer的length()和capacity()方法对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

StringBuffer的length()和capacity()

StringBuffer类和String类差不多,都是字符串类,只是StringBuffer在对字符串进行修改时不会生成新的对象,所以效率相对较高,占用空间也小。

length()方法和capacity()方法都是获取StringBuffer的长度。

length()返回字符串的实际长度;

capacity()返回字符串所占容器的总大小。

举例:

java中StringBuffer的length()和capacity()方法对比

可以看到:

1.StringBuffer的的初始大小为(16+初始字符串长度)即capacity=16+初始字符串长度;

2.一旦length大于capacity时,capacity便在前一次的基础上加1后倍增;

例如:

length=1;capacity=17;//初始长度
length=5;capacity=17;//
length=17;capacity=17;//
length=18;capacity=(capacity+1)*2=36;//第一次倍增
............
length=37;capacity=(capacity+1)*2=74;//第二次倍增
............

但有如下特殊情况:

    StringBuffer sb3=new StringBuffer("a");
        System.out.println("length="+sb3.length());//length=1
        System.out.println("capacity="+sb3.capacity());//capacity=17;
        System.out.println("--------------------");
        sb3.append("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
        System.out.println("length="+sb3.length());//length=20;
        System.out.println("capacity="+sb3.capacity());//capacity=40;

当length>capacity时,capacity倍增仍达不到length的长度,这种现象称为跨阶,此时,capacity将根据length的实际大小设置长度,此后将按照直接倍增的方式增长(不将length+1)

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类;

源码都调用父类来进行初始化:

java中StringBuffer的length()和capacity()方法对比

StringBuffer(String s)的初始化:

java中StringBuffer的length()和capacity()方法对比

扩容算法:

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

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

java中StringBuffer的length()和capacity()方法对比

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/wxgxgp/article/details/55657078

延伸 · 阅读

精彩推荐