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