StringBuffer、StringBuilder底层扩容

StringBuffer 与 StringBuilder底层分析、扩容机制与常用方法

StringBuffer(线性安全)

  1. 直接父类AbstractStringBuilder
  2. 实现了Serializable,可以串行化
  3. 在父类AbstractStringBuilder有属性char[] value 不是final类型,该value数字存放字符串内容,引出存放在堆中,所以在变化的时候不用每次都更改地址,创建新的对象,效率高
  4. 是一个final类,不能被继承

StringBuffer构造方法

  1. StringBuffer()初始容量为16
  2. StringBuffer(int capacity) 初始容量为指定大小
  3. StringBuffer(String str) 初始容量为指定字符串+16,注意是容量不是长度

StringBuffer扩容 (StringBuilder扩容机制一样)

扩容方式:2n+2

源码:

private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int newCapacity = (value.length << 1) + 2;
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    }

StringBuffer、StringBuilder的类继承结构图,两者的结构图是一样的

StringBuilder、StringBuffer类继承结构图.png

StringBuffer常用方法

  1. 增 append
  2. 删 delete(start,end)
  3. 改 replace (start,end,string) ,string是要修改成的新内容
  4. 查 indexOf(string) , string是要 查找的内容
  5. 插入 insert
  6. 获取长度 length() 注意有括号

StringBuilder (不安全)

  • 线程不安全,单线程优先使用,方法中没有synchronized修饰
  • 主要操作时append和insert,可以重载这些方法,可以接受任何类型的数据
  • 扩容机制与StringBuffer一样

String、StringBuffer、StringBuilder三者之间的区别

  1. StringBuffer、StringBuilder 均代表可变字符串,方法一样
  2. String:不可变字符序列,效率低,但是复用率高
  3. StringBuffer:可变字符串、增删效率高,线性安全
  4. StringBuilder:可变字符串、增删效率高,线性不安全

使用场景

1.如果字符串存在大量的修改操作,一般使用StringBuffer 或StringBuilder

2 . 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder

3.如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer

4.如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等

全部评论

相关推荐

04-30 18:06
已编辑
门头沟学院 C++
ResourceUtilization:佬是哪个部门的
查看10道真题和解析
点赞 评论 收藏
分享
05-15 18:12
门头沟学院 Java
全程1h,结合实习、项目,穿插着八股进行提问,无自我介绍,无手撕1.&nbsp;我看你实习时间挺久的,实习主要做的工作?医疗平台的功能?服务量级?2.&nbsp;实习过程中遇到有挑战的事?相关背景,问题和解决方法?3.&nbsp;系统集群的规模和相关节点的配置?4.&nbsp;多租户架构,为什么采用了基于DataBase/Schema级别的隔离?如何通过租户标识进行DataBase路由?5.&nbsp;考虑一个场景,存在大租户对于系统来说影响很大,甚至不可接受,如何进行解决?(回答租户分级,大租户独立节点)6.&nbsp;&nbsp;k8s中使用nginx-ingress-controller和直接使用nginx的区别?使用Ingress集成nginx和使用普通的容器集成有什么区别7.&nbsp;Deployment和Pod的区别?Pod和Container的区别?既然建议一个Pod封装一个Contanier为什么要封装Pod而不是直接使用Container?(回答可能有主Container和从Container)什么场景下会使用?(不会)8.&nbsp;java与python的异同?如果用SpringBoot,怎么实现多租户架构?9.&nbsp;如果需要扩展租户物理节点,如何做到修改配置不重启服务?(回答配置中心)10.&nbsp;数据库采用主从架构,如果主从之间网络忽然连接不上,导致数据不同步,如何解决?(回答暂时解除主从关系)&nbsp;暂时解除主从关系,如何实现?(回答采用Mycat,修改XML配置文件)追问如果不通过中间件如何解决?(回答配置中心?)追问Nacos配置中心修改配置可以立即生效吗?如何做到的?11.&nbsp;医疗平台对隐私安全比较注重,体现在哪些方面?12.&nbsp;&nbsp;https如何保证安全?如何确保TLS握手的对象是对的?如何确保CA机构是权威的?有没有可能伪造CA机构?(想了想不知道如何防伪)13.&nbsp;如果没有nginx或是ingress,会有什么问题?nginx或是ingress是如何实现负载均衡的?以及它们如何能够转发到对应IP的?14.&nbsp;微服务的注册中心原理?如何动态的进行服务发现?微服务的注册中心节点一般也是集群,如何确保集群内部的各个节点都有完整的信息?(回答可能是定期通讯)如果请求落到的节点没有完整的信息怎么办?(回答可能是请求其他节点,不会)15.&nbsp;实验室项目开发过程中,是如何进行沟通的?如何确保项目整体的推进?16.&nbsp;项目用到线程池,如果执行任务过程中,节点宕机了,恢复后如何可以继续执行?(回答持久化)如果持久化过程中宕机的,导致没有落库成功呢?(不会)17.&nbsp;线程池使用什么方法创建的,为什么不用Executors创建?18.&nbsp;项目中用到SPI机制,具体是怎么用的?(回答作为框架功能扩充者,以扩充ShardingJDBC框架)19.&nbsp;分表ID怎么生成的?为什么使用UUID?UUID和自增ID的区别?20.&nbsp;有调优过JVM参数吗?(回答自己玩过,线上只修改过垃圾回收器)CMS和G1的异同?为什么G1可以设置停顿时间?如何评估Region的价值?(忘了)21.&nbsp;Redis和MemCache区别?什么场景使用MemCache?22.&nbsp;RabbitMQ,RocketMQ,Kafka的差异?Kafka为什么这么快了解过吗?(回答只知道零拷贝)聊天:中国海洋大学在海南吗?(在青岛,回答做导师项目来三亚的)有没有感兴趣的方向?有没有想要发展的地方?(回答广州)有没有找到其他的实习?(回答没有,没人要🐀🐀)反问:部门业务(游戏平台,游戏账号买卖,游戏包分发,游戏加速工具)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务