3. StringBuilder类

概述
java.lang.Object 包下
public final class StringBuilder extends Object implements Serializable,CharSequence
String 类

字符串是常量,他们的值在创建之后不能被修改

字符串的底层是一个被 final 修饰的数组,不能改变,是一个常量

private final char value[]; 是以字节的形式存储在内存当中

进行字符串相加的时候,占用空间大,效率低下

String str = new String("abc");
String str2 = "a" + "b" + "c";
/*
"a" "b" "c"
"ab" "abc"
五个字符串
*/
System.out.println(str == str2); // false 内存地址不同
StringBuilder类

字符串缓冲区,可以提高字符串的操作效率(可以把它看作是一个长度可变的字符串)

底层也是一个数组,但是没有被 final 修饰,是可以改变长度的.

char[] value = new  char[16];

StringBuilder str = "a" + "b" +"c" = "abc"

StringBuilder 在内存中始终是一个数组,占用的空间比较小,效率比较高

如果超出了StringBuilder 的容器,会自动扩容

构造方法
public StringBuilder() 构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符
public StringBuilder(String str)构造一个字符串生成器,并初始化为指定的字符串内容
示例
// 两种构造方法的使用
        StringBuilder stringBuilder = new StringBuilder("abc");
        System.out.println("使用带参的构造方法" + stringBuilder);

        StringBuilder builder = new StringBuilder();
        System.out.println("空参构造的字符串缓冲区: " + builder);
        StringBuilder builder2 = new StringBuilder();
        System.out.println("空参构造的字符串缓冲区: " + builder);

        System.out.println(builder.hashCode());
        System.out.println(builder2.hashCode());
        // 不同的 hash code
        
        boolean result = builder.equals(builder2);
        System.out.println(result);
        // 地址比较
        // false
        
        boolean result2 = builder.toString().equals(builder2.toString());
        System.out.println(result2); 
        // 内容比较
        // true
常用方法
public StringBuilder append(...)
    添加任意类型数据的字符串形式,并返回当前对象本身 this

示例

// 构建一个字符串缓冲区对象
        StringBuilder stringBuilder = new StringBuilder();

        // 返回的是this,相当于把 sb 的地址值给 sb2
        StringBuilder stringBuilder2 = stringBuilder.append("abc");

        //
        System.out.println("内容");
        System.out.println(stringBuilder);
        System.out.println(stringBuilder2);

        // 460141958
        // 460141958
        System.out.println("哈希地址");
        System.out.println(stringBuilder.hashCode());
        System.out.println(stringBuilder2.hashCode());

        // 地址比较结果为 true
        System.out.println(stringBuilder == stringBuilder2);

        // StringBuilder 转 String 类型
        String string = stringBuilder.toString();

        stringBuilder.append(1);
        stringBuilder.append(false);
        stringBuilder.append('G');
        stringBuilder.append(3.14);
        
        System.out.println(stringBuilder2);//abc1falseG3.14

		// 操作stringbuilder ,打印 stringBuilder2 ,结果同样改变了
// 如果一个方法的返回值是自己本身,那么我们可以进行链式调用,或者链式编程
stringBuilder.append("G").append("Z").append("R");
System.out.println(stringBuilder);// GZR

String str = "abc".toUpperCase().toLowerCase().toUpperCase().toLowerCase();
System.out.println(str);
System.out.println(str == "abc"); // false
StringBuilder 和 String 之间的转换
String 转 StringBuilder
String -- > StringBuilder
        使用StringBuilder(String str)构造一个字符串生成器,并初始化为指定的字符串内容
    
    String str = "hi";
    StringBuilder bu = new StringBuilder(str);

    // 添加一些数据
    bu.append(" Java");
    System.out.println("该StringBuilder :" + bu);
    // 该StringBuilder :hi Java
StringBuilder 转 String
StringBuilder --> String
            public String toString() 将StringBuilder对象转换成String对象
    
      String s = bu.toString();
      System.out.println(s);

// 比较
System.out.println(s.equals(bu)); 
// false 原因是类型不一致 一个是String 一个是StringBuilder
System.out.println(s.equals(bu.toString())); 
// true 内容是一致的
StringBuilder 自动扩容
1.返回的容量至少与给最小容量一样大    
2.容量 * 2 + 2
3.Integer.Max -8
4.异常
    
16 -> 34 -> 自身的大小 -> Integer.Max -8 -> 容量不够异常,内存越界 overflow

StringBuilder 中 成员方法 Insert 的用法

概述

public StringBuilder insert(int offset,...)
    根据指定的位置插入任意类型数据的字符串形式,返回的是当前对象

容量和长度

// 构建 StringBuilder 对象
        StringBuilder sb = new StringBuilder();
        // 调用 insert 方法
        StringBuilder a = sb.insert(0, "A");
        System.out.println(sb);
        /* 范围限制
        if ((offset < 0) || (offset > length()))
            throw new StringIndexOutOfBoundsException(offset);
        if (str == null)
            str = "null";
        */
        System.out.println("StringBuilder 的长度: "+sb.length());// 1
        System.out.println("StringBuilder 的容量"+sb.capacity());// 16

StringBuilder 存储 对象

JavaBean Student
    age
    name


Student student = new Student();
        student.setAge(10);
        student.setName("xx");

        sb.insert(1, student);
        System.out.println(sb);

没有toString的情况:StringBuilder.Student@1b6d3586
有toString的情况  :Student{age=10, name='xx'}
注意区分 长度 和 容量
System.out.println("StringBuilder 的长度: "+sb.length());// 1
System.out.println("StringBuilder 的容量"+sb.capacity());// 16