StringBuilder,字符串原理

StringBuilder概述

StringBuilder可以看成是一个容器,创建之后里面的内容是可变的

作用:提高字符串的操作效率

String Builder是Java已经写好的类,Java在底层对他做了一些特殊处理,打印对象不是地址值二十属性值

package stringdemo;

public class StringBuilderDemo {
    public static void main(String[] args) {
        //1.创建对象
        StringBuilder sb = new StringBuilder("sb");
        //添加元素
        sb.append(133);
        //反转
        sb.reverse();
        //获取长度
        int len = sb.length();
        System.out.println(sb);
        System.out.println(len);
    }
}

 

package stringdemo;

public class SteingBuilderDemo2 {
    public static void main(String[] args) {
        //创建对象
        StringBuilder sb = new StringBuilder();
        //添加字符串
        sb.append("sad");
        sb.append("sda");
        sb.append("ada");
        sb.append("dsa");
        System.out.println(sb);
        //3.再把String Builder变回去
        String str = sb.toString();
        System.out.println(str);

    }
}

链式编程

当我们在调用一个方法的时候,不需要用变量接收他的成果,可以继续调用其他方法可以进行改写

sb.append("sad").append("sda").append("ada").append("dsa");

回文字符串小练习

package stringdemo;

import java.util.Scanner;

public class StringBuilderDemo3 {
    public static void main(String[] args) {
        //1.对称
        //2.键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();
        //2.反转键盘录入的字符串
        String result = new StringBuilder().append(str).reverse().toString();
        //3.进行比较
        if (str.equals(result)){
            System.out.println("当前字符串是对称字符串");
        }else {
            System.out.println("当前字符串不是对称字符串");
        }

    }
}

使用String Builder的场景

1.字符串的拼接

2.字符串的反转

拼接字符串小练习

package stringdemo;

public class StringBuilder4 {
    public static void main(String[] args) {
        //1.定义数组
        int arr[] = {1,2,3};
        //调用数组变成字符串
        String str = arrToString(arr);
        System.out.println(str);
    }
    public static  String arrToString(int[] arr){
        StringBuilder sb = new StringBuilder().append("[");
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length-1){
                sb.append(arr[i]);
            }else {
                sb.append(arr[i]).append(",");
            }
        }
        sb.append("]");
        return sb.toString();
    }

}

扩展底层原理

1.字符串存储的内存原理

直接赋值会复用字符串常量池中的

new出来不会服用,而是开辟一个新的空间

2.==号比较到底是什么

基本数据类型比较数据值

引用数据类型比较地址值

3.字符串拼接的底层原理

(1)等号右边没有变量

拼接的时候没有变量,都是字符串

触发字符串优化机制

在编译的时候就已经是最终结果了

(2)等号右边有变量参与

调用了StringBuilder

JDK8字符串拼接的底层原理

会对字符串产生一个预估,产生一个数组

4.String Builder提高效率的原理图解

是一个内容可变的容器

String Builder源码分析

如果超过了容量,那么就会自动扩容,容量*2+2,如多超出了默认扩容,那么容量会以实际长度为准

扩容

如果超出扩容

返回实际长度

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值