SiringBuilder可变字符操作

当对字符串进行操作时,就需要使用StringBuffer和StringBuilder类。而为什么不使用String类?

是因为String类在使用的时候,因为它具有不可变性,每次通过new String()创建都会在堆中开辟一片空间,会造成资源的浪费。

String底层是被final修饰的char[] value
String类所提供的所有的方法,new String()

为了解决这个问题,Java提供了StringBuilder类,是一个可变的字符串操作类,允许我们对字符串进行高效的操作。


 ①StringBuilder的初始化

要使用StringBuilder类,我们首先需要创建一个StringBuilder对象。

可以使用无参构造函数创建一个初始容量为16的空StringBuilder对象,

或者使用带有初始容量参数的构造函数创建指定容量大小的StringBuilder对象。

StringBuilder可变,追加不会创建新的对象
StringBuilder() 无参构造方法--- 初始化数组的容量16,扩容机制:value.length<<1+2
StringBuilder(int capacity) 指定数组的初始化容量
StringBuilder("") --初始化容量"".length+16

// 无参构造函数创建StringBuilder对象
StringBuilder sb1 = new StringBuilder();

// 带有初始容量参数的构造函数创建StringBuilder对象
// 括号传入基本数据类型
StringBuilder sb2 = new StringBuilder(20);
// 括号传入引用数据类型
StringBuilder sb3 = new StringBuilder("爪爪");

这三种创建的空间大小如下:

1. 无参构造函数创建的StringBuilder对象,其初始容量为16个字符。因此,空间大小为16个字符。

2. 带有初始容量参数的构造函数创建的StringBuilder对象,括号内传入的是基本数据类型(这里是整数20),表示对象的初始容量为20个字符。因此,空间大小为20个字符。

3. 带有初始容量参数的构造函数创建的StringBuilder对象,括号内传入的是引用数据类型(这里是字符串"爪爪"),表示对象的初始容量为字符串的长度加上额外的16个字符。因此,空间大小为字符串长度加上额外16个字符。在这个例子中,字符串"爪爪"的长度为2,所以空间大小为2 + 16 = 18个字符。


 ②StringBuilder的一些常见方法如下:

//append()追加元素,追加到末尾
for (char i = 'a'; i <= 'z'; i++) {
    sb.append(i); 
}

//insert(指定位置,元素) 将元素添加到指定的位置
sb.insert(26,"我是中国人");
String str = null;
sb.append(str);
System.out.println(sb);

//删除指定区间的字符delete[start,end)
sb.delete(0, 2);
System.out.println(sb);
		
//charAt()获取指定下标对应的字符
char ch = sb.charAt(0);
System.out.println(ch);
		
//deleteCharAt(删除指定下标对应的字符)
sb.deleteCharAt(0);
System.out.println(sb);
		
//链式操作
sb.delete(0, 2).deleteCharAt(0);
System.out.println(sb);
sb.delete(0, sb.length());//清空所有的字符
System.out.println(sb);
System.out.println("11111111");

//字符串替换
//replace(start, end-1, 要替换的字符串)
sb.replace(0, 2, "广西");
System.out.println(sb);
		
//字符串反转
sb.reverse();
System.out.println(sb);

另外,值得注意的是,StringBuilder没有重写equals()方法,在比较时,由于继承顶级父类的Object的equals方法,所以比较的是地址,而不是值。

StringBuilder sb1 = new StringBuilder("hello");
StringBuilder sb2 = new StringBuilder("hello");
//比较的是地址
System.out.println(sb1 == sb2);
// StringBuilder中没有重写equals方法,这里比较值
System.out.println(sb1.equals(sb2));
// .toString,String类中重写了equals()方法,这里比较的是内容
System.out.println(sb1.toString().equals(sb2.toString()));

③StringBuilder的性能优势:

与使用String进行字符串操作相比,StringBuilder具有更高的性能和效率。这是因为StringBuilder是可变的,它可以在原始对象上进行修改,而不是每次都创建一个新的字符串对象。这种可变性使得StringBuilder在频繁的字符串操作场景下更具优势。以下是性能对比示例代码:

String str = "";
for (int i = 0; i < 10000; i++) {
    str += i;
}

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
    sb.append(i);
}

 在上述示例中,我们使用String和StringBuilder分别进行10000次字符串拼接操作。通过比较运行时间,可以明显看出StringBuilder的性能优势。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值