StringBuilder 和 StringBuffer

StringBuilder详解
本文详细介绍了StringBuilder与StringBuffer的区别,重点讲解了StringBuilder的工作原理及其主要方法。通过对比String对象,阐述了在大量字符串处理场景下使用StringBuilder的优势。

StringBuilder 和 StringBuffer


StringBuffer 和 StringBuilder API 几乎一样

StringBuffer 是java早期提供的,速度稍慢,线程安全

StringBuilder 是 java5以后提供的,速度快,非线程安全

 

java.lang.StringBuilder

 
 String = char[]+操作(复制创建新对象) char[]不可变
 
 StringBuilder = char[] +对char[]操作(处理当前数组内容)
 
 
 StringBuilder 内部的 char[]数组内容可变,如果长度不够,利用变长算法维护,自动扩充长度。
 
 
 StringBuilder sb = new StringBuilder();//默认的长度是16
 
 
 int capacity = sb.capacity(); //返回当前容量 16
 
 int length = sb.length(); // 实际长度(字符数)

 
 sb = new StringBuilder(10); // 自定义初始长度 

 
主要方法:
  
 StringBuilder append( 要追加的内容 ) 追加,该方法反复操作的适中是一个对象
  
 StringBuilder insert( 偏移量,要插入的内容) 插入
  
 StringBuilder delete( int start,int end) 删除
  
 StringBuilder deleteCharAt(int index)
 (都返回对象本身的引用)

 

 

 

String s = s1 + s2;java实际上是按照如下代码运行:

String s = new StringBuilder(s1).append(s2).toString();

 

s+="a" 会产生两个新对象(StringBuilder 和 String)

s = new StringBuilder(s).append("a").toString();

每做一次字符串拼接就会创建一个新的StringBuilder对象,同时jvm在适时回收这些对象,
如此会严重影响性能。


如果软件需要大量字符串处理时建议使用SringBuilder;

如果对字符串性能有极高要求,则直接操作char[]数组

### 介绍 `StringBuilder` `StringBuffer` 是 Java 中用于处理可变字符串的类。`StringBuilder` 是 JDK 1.5 引入的, `StringBuffer` 的方法完全相同,它们都继承自 `AbstractStringBuilder` 类,提供了一系列用于修改字符串内容的方法,如 `append()`、`insert()`、`delete()` 等 [^4][^5]。 ### 区别 - **线程安全性**:`StringBuffer` 的所有方法都使用了 `synchronized` 关键字修饰,因此它是线程安全的,适合在多线程环境下使用;而 `StringBuilder` 没有实现线程安全功能,在单线程环境下使用效率更高 [^4][^5]。 - **性能**:由于 `StringBuffer` 要保证线程安全,会有额外的同步开销,所以在单线程环境下,`StringBuilder` 的性能比 `StringBuffer` 更高 [^4][^5]。 ### 使用场景 - **`StringBuilder` 的使用场景**:在单线程环境下,当需要频繁对字符串进行修改操作时,优先选择 `StringBuilder`,因为它的性能更高。例如: ```java StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) { sb.append(i); } System.out.println(sb.toString()); ``` - **`StringBuffer` 的使用场景**:在多线程环境下,当需要对字符串进行并发修改操作时,应该使用 `StringBuffer` 以保证线程安全。例如: ```java StringBuffer sbf = new StringBuffer(); Runnable task = () -> { for (int i = 0; i < 100; i++) { sbf.append(i); } }; Thread t1 = new Thread(task); Thread t2 = new Thread(task); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(sbf.length()); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值