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

 更新时间:2021年07月06日 08:46:44   作者:石头剪刀布_  
这篇文章主要介绍了java中StringBuffer的length()和capacity()方法对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

StringBuffer的length()和capacity()

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

length()方法和capacity()方法都是获取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类;

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

StringBuffer(String s)的初始化:

扩容算法:

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

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

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

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

相关文章

  • java Collection集合接口的介绍和使用详解

    java Collection集合接口的介绍和使用详解

    这篇文章主要为大家介绍了java Collection集合接口的介绍和使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 解决Hmily与Feign冲突报错 NullPointerException的问题

    解决Hmily与Feign冲突报错 NullPointerException的问题

    这篇文章主要介绍了解决Hmily与Feign冲突报错 NullPointerException的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • idea中maven本地仓库jar包打包失败和无法引用的问题解决

    idea中maven本地仓库jar包打包失败和无法引用的问题解决

    本文主要介绍了idea中maven本地仓库jar包打包失败和无法引用的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 浅谈java类和对象

    浅谈java类和对象

    这篇文章主要介绍了浅谈java类和对象,对于面向对象的开发来讲也分为三个过程:OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程),本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • mybatis generator只能生成insert和selectAll的操作

    mybatis generator只能生成insert和selectAll的操作

    这篇文章主要介绍了mybatis generator只能生成insert和selectAll的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 很简单的Java断点续传实现原理

    很简单的Java断点续传实现原理

    这篇文章主要以实例的方式为大家详细介绍了简单的Java断点续传实现原理,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Java如何利用Mybatis进行数据权限控制详解

    Java如何利用Mybatis进行数据权限控制详解

    这篇文章主要介绍了Java如何利用Mybatis进行数据权限控制详解,数据权限控制最终的效果是会要求在同一个数据请求方法中,根据不同的权限返回不同的数据集,而且无需并且不能由研发编码控制。,需要的朋友可以参考下
    2019-06-06
  • java常用工具类 Reflect反射工具类、String字符串工具类

    java常用工具类 Reflect反射工具类、String字符串工具类

    这篇文章主要为大家详细介绍了java常用工具类,包括Reflect反射工具类、String字符串工具类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Springboot3整合Mybatis3的完整步骤记录

    Springboot3整合Mybatis3的完整步骤记录

    这篇文章主要给大家介绍了关于Springboot3整合Mybatis3的完整步骤,Spring Boot和MyBatis分别是两个功能强大的框架,它们的协同使用可以极大地简化数据访问层的开发,提高整体的开发效率,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • java环境配好后jar文件打开命令框闪退(无打开方式,无反应)解决办法

    java环境配好后jar文件打开命令框闪退(无打开方式,无反应)解决办法

    在Java开发中我们经常会遇到运行Jar包时闪退的问题,下面这篇文章主要给大家介绍了关于java环境配好后jar文件打开命令框闪退(无打开方式,无反应)的解决办法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-04-04

最新评论