String类 StringBuffer 类和 StringBuilder 类

本文深入探讨了Java中String、StringBuilder和StringBuffer三个类的区别与应用。解析了它们在创建速度、线程安全性及使用场景上的差异,同时详细介绍了StringBuffer类的常用方法,帮助开发者在不同场景下选择合适的数据结构。

String类 StringBuffer 类和 StringBuilder 类

1)三者创建的速度:StringBuild>StringBuffer>String

2)String是字符串常量,而StringBuffer 和 StringBuilder 是字符串变量

String str="abc";

System.out.println(str);

str=str+"de";

System.out.println(str);


​

String是首先创建了一个对象赋值“abc” ,然后重新创建了一个对象存储“abcde”,将原来的对象释放掉的。

​StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");

System.out.println(stringBuilder.toString());

直接创建stringBuilder对象,修改它的值,并且不产生新的未使用对象。

3)StringBuilder 类不是线程安全的(不能同步访问,在多线程中不能使用,但由于其速度快经常被使用), StringBuffer 是线程安全的(多线程可以使用)。

使用场景:

String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

 

StringBuffer 方法

以下是 StringBuffer 类支持的主要方法:

序号方法描述
1public StringBuffer append(String s)
将指定的字符串追加到此字符序列。
2public StringBuffer reverse()
 将此字符序列用其反转形式取代。
3public delete(int start, int end)
移除此序列的子字符串中的字符。
4public insert(int offset, int i)
int 参数的字符串表示形式插入此序列中。
5replace(int start, int end, String str)
使用给定 String 中的字符替换此序列的子字符串中的字符。

下面的列表里的方法和 String 类的方法类似:

序号方法描述
1int capacity()
返回当前容量。
2char charAt(int index)
返回此序列中指定索引处的 char 值。
3void ensureCapacity(int minimumCapacity)
确保容量至少等于指定的最小值。
4void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符从此序列复制到目标字符数组 dst
5int indexOf(String str)
返回第一次出现的指定子字符串在该字符串中的索引。
6int indexOf(String str, int fromIndex)
从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
7int lastIndexOf(String str)
返回最右边出现的指定子字符串在此字符串中的索引。
8int lastIndexOf(String str, int fromIndex)
返回 String 对象中子字符串最后出现的位置。
9int length()
 返回长度(字符数)。
10void setCharAt(int index, char ch)
将给定索引处的字符设置为 ch
11void setLength(int newLength)
设置字符序列的长度。
12CharSequence subSequence(int start, int end)
返回一个新的字符序列,该字符序列是此序列的子序列。
13String substring(int start)
返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
14String substring(int start, int end)
返回一个新的 String,它包含此序列当前所包含的字符子序列。
15String toString()
返回此序列中数据的字符串表示形式。

 

已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 常见问题解答 网页打开速度慢或者打不开网页? 受到多种因素的影响,对于非会员用户我们无法提供最优质的服务。 如果您希望得到最棒的体验,请至大会员页面("右上角菜单 → 大会员")根据说明操作。 请注意:受制于国际网络的诸多不确定性,我们无法对任何服务的可靠性做出任何保证。 如果出现了网络连接相关的问题,我们建议您先等待一段时间,之后再重试。 如果您在重试后发现问题仍然存在,请联系我们,并说明网络问题持续的时间。 图片下载后无法找到? 打开"右上角菜单 → 更多 → 修改下载路径",在弹出的对话框中可以看到当前图片的保存路径。 此外,由于网络因素,在保存图片之后,等待屏幕下方出现"已保存到..."后,才能在本地找到图片。 如何更改图片保存的目录? 请参见"右上角菜单 → 更多 → 修改下载路径"。 翻页不方便? 在点进某个图片后,通过在图片上向左或向右滑动,即可翻页查看下一个作品。 如何保存原图/导出动图? 长按图片/动图,在弹出的菜单中选择保存/导出即可。 输入账号密码后出现"进行人机身份验证"? 此为pixiv登陆时的验证码,请按照要求点击方框或图片。 在pxvr中注册pixiv账号后,收到验证邮件,无法访问邮件中的验证链接? 请复制邮件中的链接,打开pxvr中的"右上角菜单 → 输入地址"进行访问。 能否自动将页面内容翻译为汉语? 很抱歉,pxvr暂不提供语言翻译服务。 图片下载型是否可以选择? 能否批量下载/批量管理下载? 已支持批量下载多图作品中的所有原图:找到一个多图作品,进入详情页面后,点击图片进入多图浏览模式,长按任意一张图片即可看到批量下载选项。 关于上述其他功能,我们...
### 三者的定义与特性 `String` 是一个不可变的字符序列,一旦创建就不能更改。每次对 `String` 对象进行修改时,实际上都是创建了一个新的 `String` 实例,并将原来的值复制进去。这种设计保证了 `String` 的安全性与复用性,但在频繁操作字符串的情况下会导致性能下降。 `StringBuffer` `StringBuilder` 都是可变的字符序列,它们允许在不创建新对象的情况下对字符串进行修改。两者的主要区别在于线程安全性:`StringBuffer` 是线程安全的,它的方法都被 `synchronized` 关键字修饰;而 `StringBuilder` 不是线程安全的,因此在单线程环境下具有更高的性能[^1]。 ### 使用场景分析 当需要处理少量且不经常变化的数据时,可以使用 `String` ,因为在这种情况下,`String` 的不可变性复用性可以带来一定的优势。然而,在涉及到大量字符串拼接或者频繁修改字符串内容的情况下,应该优先考虑使用 `StringBuffer` 或 `StringBuilder` [^2]。 对于多线程环境下的字符串操作,为了确保数据的一致性完整性,应当选择 `StringBuffer` 。而在单线程环境下,则推荐使用 `StringBuilder` ,因为它提供了比 `StringBuffer` 更好的性能表现,同时功能上与 `StringBuffer` 完全一致[^3]。 ### 性能对比 由于 `String` 的不可变性,在进行多次拼接或替换操作时会不断地产生新的对象,这无疑增加了内存消耗并降低了程序执行效率。相比之下,`StringBuffer` `StringBuilder` 在进行这些操作时直接作用于原字符串,不会产生多余的对象,从而减少了垃圾回收的压力并提高了程序运行的速度[^4]。 此外,虽然 `StringBuilder` 与 `StringBuffer` 功能相似,但由于 `StringBuilder` 没有同步机制的支持,所以在性能测试中通常能够展现出略优于 `StringBuffer` 的表现[^5]。 ### 示例代码 下面是一个简单的示例,演示了如何使用 `StringBuilder` 进行高效的字符串拼接操作: ```java public class Main { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 100; i++) { sb.append(i); } System.out.println(sb.toString()); } } ``` 在这个例子中,我们通过循环向 `StringBuilder` 实例中追加数字,最终输出结果为 "0123456789..." 直到 99。这样的操作如果使用 `String` 来实现,则会导致大量的临时对象生成,进而影响程序性能。 ### 小结 综上所述,根据不同的应用场景选择合适的是非常重要的: - 如果不需要修改字符串并且希望获得较高的复用率,可以选择 `String`。 - 在多线程环境中进行字符串操作时,应选用 `StringBuffer` 以确保线程安全。 - 单线程下频繁地进行字符串拼接、替换等操作时,`StringBuilder` 是最佳的选择,因为它提供了最优的性能[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值