【Java杂谈】StringBuffer 和StringBuilder 类

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言——从可变数据类型与不可变数据类型谈起

字符串广泛应用于各种编程语言中,Java提供了String类来创建和操作字符串。

但是String是一种不可变数据类型——当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,如下图所示:
举例
当我们执行以下代码:

1 String s = "a";
2 System.out.println(s.hashCode());
3 s = "abc";
4 System.out.println(s.hashCode());

控制台输出:
在这里插入图片描述
说明对字符串s赋值“abc”后,指向了不同的内存地址。

对不可变数据类型的值进行修改会导致对象指向一个新的内存地址,这在很多时候性能表现都不是很好,我们需要一个可变的——当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变的数据类型。

在Java编程中,一般代替String的有两种可变数据类型:StringBuffer 和StringBuilder 类。

一、StringBuffer 和StringBuilder是什么?

StringBuffer 和 StringBuilder 类都是可变的字符串数据类型。它们的对象能够被多次的修改,对其操作是对对象本身进行操作,而不是生成新的对象。如下图所示:
StringBuilder
执行以下代码:

1 StringBuilder sb = new StringBuilder();
2 sb.append("a");
3 System.out.println(sb.hashCode());
4 sb.append("bc");
5 System.out.println(sb.hashCode());

控制台打印:

在这里插入图片描述
表明StringBuilder类的对象sb在执行第4行代码后其指向的内存地址未发生变化。

同样的StringBuffer也具有这样的性质:

执行以下代码:

1 StringBuffer sb = new StringBuffer();
2 sb.append("a");
3 System.out.println(sb.hashCode());
4 sb.append("bc");
5 System.out.println(sb.hashCode());

控制台输出:

在这里插入图片描述

二、StringBuffer 和StringBuilder的使用(以StringBuilder为例)

1.使用构造器创建一个新对象

官方文档中描述StringBuilder具有以下四个构造器:

在这里插入图片描述
通常使用第一个和最后一个较多。

注意:不同于String,StringBuilder不可以直接赋值,以下写法均会报错:

StringBuilder sb1 = "123";
StringBuilder sb2 = new StringBuilder();
sb2 = 123;

StringBuffer创建方法及注意事项与StringBuilder相同。

2.常见用法

常见用法如下:

1.StringBuilder append(String str) 将指定的字符串追加到此字符序列。
2. StringBuilder insert(int offset, char c) 将参数的字符串表示形式插入到此序列中。
3.StringBuilder deleteCharAt(int index) 删除指定位置的字符。
4. StringBuilder delete(int start, int end) 删除此序列指定位置的字符。
5. StringBuilder replace(int start, int end, String str) 用指定的字符串替换此序列的指定位置的子字符串
6. String substring(int start) 返回包含当前包含在此字符序列中的字符
7. String substring(int start, int end) 返回包含当前包含在此字符序列中的字符

代码演示如下:

//创建StringBuilder对象
StringBuilder sb = new StringBuilder();
//添加功能
sb.append("ello! ");
sb.insert(0, "H");//从指定位置添加
//删除功能
sb.deleteCharAt(0);//删除指定下标元素
sb.delete(0, 2);//删除区间元素(包括0不包括2)
//替换功能
sb.replace(0, 1, "Good!");//将指定区间元素替换(包括0不包括1)
//截取功能
String s1 = sb.substring(2);//从参数位置开始截取字符串,返回String类型的截取结果
String s2 = sb.substring(2, 4);//从区间截取字符串(包括2不包括4),返回String类型的截取结果

StringBuffer用法与StringBuilder相同。

三、StringBuffer 和StringBuilder的区别

二者最主要区别是:StringBuffer多线程安全的,StringBuilder多线程不安全。

对比二者源码:

StringBuffer:

在这里插入图片描述

StringBuffer

StringBuilder:

在这里插入图片描述

StringBuilder

我们发现StringBuffer中的方法加了synchronized修饰,因而是线程安全的,但也会存在效率不如StringBuilder的问题。

因而一般开发中,当没有线程安全需求时使用StringBuilder较多,当有线程安全的需求时则更建议使用StringBuffer。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了StringBuffer 和StringBuilder的特点和用法,以及两者之间的不同。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值