字符串——第二部分(StringBuilder、StringJoiner、字符串底层原理)

字符串——第二部分(StringBuilder、StringJoiner、字符串底层原理)

1.StringBuilder(字符串拼接、反转中常用

普通string创建都是不可变的,eg:s=s1+s2+s3,字符串先让s1+s2创建出一个字符串,在与s3创建出一个字符串,本质上创建了两个字符串。

1.1 构建方法

1.2 成员方法:所有方法在容器内发生

示例代码:StringBuilder是Java写好的类,Java对其进行了一些处理,打印时输出的不是地址值,而是属性值

append、reserve、length方法

tostring方法:利用完stringbuilder工具后,转回字符串,以便使用字符串的方法

1.3 链式编程:当调用一个方法时,不需要用变量接收他的结果,可以继续调用其他方法

如下:“2、添加字符串 ”   代码示例:

public class StringBuilderDemo4 {
    public static void main(String[] args) {
        //1.创建对象
        StringBuilder sb = new StringBuilder();

        //2.添加字符串
        sb.append("aaa").append("bbb").append("ccc").append("ddd");

        System.out.println(sb);//aaabbbcccddd

        //3.再把StringBuilder变回字符串
        String str = sb.toString();
        System.out.println(str);//aaabbbcccddd

    }
}

1.4 Test

1.4.1 Test1

1.4.2 Test2(与上一天笔记题相同,方法不同)

本方法:

字符串拼接方法:

2.StringJoiner(若需要中间,开头,结尾标记时使用)

2.1 构建方法(没有空参构造)

2.2 成员方法:所有方法在容器内发生

示例代码:

无区分起始、结束、间隔符号:

区分起始、结束、间隔符号:

length():计算的是包含间隔符号、起始、终止符号的总长度

3. 小结

4. 字符串底层原理

4.1 底层原理3:字符串拼接底层原理

情况1:等号右边没有变量都是字符串,如下:

触发字符串优化机制,在编译时已经是最佳结果,下面左边在编译时等同于右边

情况2.1(JDK8以前):等号右边有变量,如下:

s2=s1+"b",等同于:
new StringBuilder().append(s1).append("b").toString();每次拼接都会在堆内存中这样操作
为何在堆操作?

以下是tostring源码,可见是用new创建的,所以在堆内存中

每出现一次加号,堆内存中就有两个对象存在,每次拼接都会创建一个stringbuilder,效率低

情况2.2(JDK8以后):等号右边有变量,先根据变量,提前预估字符串长度并存入数组中

但无论什么版本,带变量拼接的字符串都是new出来的,在堆中操作

4.2 StringBuilder提高效率的原理图:内容可变的容器

所有内容都会放在StringBuilder中,不会创建许多无用的空间。

4.3 StringBuilder源码分析

4.3.1 StringBuilder内存原理

1.  StringBuilder默认容量16,长度为0,当存入<16容量的字符串时,其余空位仍为0.

2.如果容量超过16, StringBuilder会自动扩容,默认扩容:16*2+2=34,所以当容量>16且<=34时,StringBuilder容量为34。

3.如果容量超过34,StringBuilder会随着实际字符串长度改变容量,比如要存入(a-z)与(0-9)一共36位,StringBuilder会随着实际容量变更为36,容量最大到int的极限值:2147483647

代码示例:

  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
StringBuilder是Java中一个可变字符串类型,它的底层实现是一个数组,当我们往StringBuilder对象中添加字符串时,它会先判断数组是否已满,如果已满就会创建一个新的数组,并将原有的字符串复制到新的数组中,再添加新的字符串。所以StringBuilder对象可以动态的添加和删除字符串,而不需要每次都重新分配内存。 StringBuilder底层实现的具体原理如下: 1. StringBuilder内部维护了一个字符数组char[] value和一个int类型的count,用于记录当前字符串的长度。 2. 当我们向StringBuilder中添加字符串时,如果当前字符数组的长度不足以容纳新的字符串StringBuilder会先判断是否需要扩容。扩容的规则是按照原数组长度的2倍进行扩容,如果还不够,则直接扩容到新的字符串所需的长度。 3. 如果需要扩容,则会创建一个新的字符数组,将原有的字符串复制到新数组中,并添加新的字符串。 4. 如果不需要扩容,则直接将新的字符串添加到字符数组的末尾,并更新count的值。 5. 当我们需要删除字符串时,StringBuilder会将要删除的字符串从字符数组中移除,并更新count的值。 6. 当我们需要获取StringBuilder对象中的字符串时,它会根据当前count的值,将字符数组中的字符串复制到一个新的字符串中,并返回给调用者。 综上,StringBuilder底层实现的可变字符串原理就是通过动态扩容和字符数组复制来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值