Java 中 String、StringBuffer、StringBuilder 的区别
核心区别概览
| 特性 | String | StringBuffer | StringBuilder |
|---|---|---|---|
| 可变性 | 不可变 | 可变 | 可变 |
| 线程安全 | 安全(不可变) | 安全(方法加同步锁) | 不安全 |
| 性能 | 最差(频繁创建对象) | 中等 | 最好 |
| 使用场景 | 少量拼接、常量 | 多线程拼接 | 单线程拼接 |
详细对比
1. 可变性
String 是不可变类(immutable)。每次对 String 进行修改(如 += 拼接)时,都会创建一个新的 String 对象,旧对象被丢弃。
String s = "";
for (int i = 0; i < 100000; i++) {
s += 'a'; // 每次循环都创建新对象,性能极差
}
StringBuffer 和 StringBuilder 都是可变类(mutable)。它们内部维护一个字符数组,append 操作直接修改数组内容,不会创建新对象。
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append('a'); // 直接修改内部数组
}
StringBuffer sf = new StringBuffer();
for (int i = 0; i < 100000; i++){
sf.append('a');
}
2. 线程安全性
String 因为不可变,天然线程安全。
StringBuffer 的关键方法都加了 synchronized 关键字,保证多线程环境下的数据一致性:
// 可以拿这个玩一下10线程抢占
public static void StringBufferPool() throws InterruptedException{
String[] aToz = new String[]{
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"
};
//10线程
Runnable task = ()->{
StringBuffer sb = new StringBuffer();
for(int i=0;i<10;i++){
sb.append(aToz[(int) (Math.random()*26)]);
System.out.println(Thread.currentThread().getName()+"当前字符:"+sb.toString());
}
};
ExecutorService es = Executors.newFixedThreadPool(10);
for (int k = 0; k< 10 ;k++){
es.execute(task);
}
es.shutdown();
es.awaitTermination(100000, TimeUnit.MILLISECONDS);
}
部分结果:
pool-1-thread-2当前字符:r
pool-1-thread-10当前字符:b
pool-1-thread-10当前字符:bc
pool-1-thread-10当前字符:bcc
pool-1-thread-9当前字符:d
pool-1-thread-4当前字符:j
pool-1-thread-5当前字符:d
pool-1-thread-5当前字符:df
pool-1-thread-5当前字符:dfm
pool-1-thread-7当前字符:p
StringBuilder 没有同步机制,线程不安全,但因此性能更高。
3. 性能对比
| 类型 | 耗时(毫秒) | 原因 |
|---|---|---|
| String | 3883 | 每次拼接创建新对象,GC 压力大 |
| StringBuffer | 48 | 有同步开销 |
| StringBuilder | 2 | 无同步开销,性能最优 |
3883
2
48
4. 使用场景
- String:字符串内容不经常变化的场景,如常量、少量拼接
- StringBuffer:多线程环境下的字符串拼接
- StringBuilder:单线程环境下的字符串拼接(推荐)
总结
- 单线程拼接:优先使用
StringBuilder - 多线程拼接:使用
StringBuffer - 避免:在循环中使用
String进行大量拼接
到此这篇关于Java 中 String、StringBuffer、StringBuilder 的区别的文章就介绍到这了,更多相关Java String、StringBuffer、StringBuilder 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
- Java字符处理之char、String、StringBuilder和StringBuffer详解
- Java中的char、String、StringBuilder与StringBuffer全方面解析
- Java字符串四大类之String、StringBuffer、StringBuilder、StringJoiner详解
- Java中String、StringBuffer和StringBuilder底层实现深入剖析
- Java中String、StringBuffer和StringBuilder的区别
- Java中StringBuilder与StringBuffer的区别
- Java中StringBuilder与StringBuffer使用及源码解读
- 浅析Java中StringBuffer和StringBuilder的使用
- 详解Java中String,StringBuffer和StringBuilder的使用
- Java中String和StringBuffer及StringBuilder 有什么区别
相关文章
Java使用内置的toString()方法将Map转换回String类型方式
这篇文章主要介绍了Java使用内置的toString()方法将Map转换回String类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2025-05-05
Java设计模式之策略模式的使用(Strategy Pattern)
策略模式是一种行为型设计模式,用于定义一系列算法并将每个算法封装起来,使它们可以互相替换,从而实现代码的可维护性和灵活性,策略模式包含策略接口、具体策略类和上下文类,并通过将算法的选择与使用分离,使得算法可以独立变化2025-03-03
解决spring mvc 多数据源切换,不支持事务控制的问题
下面小编就为大家带来一篇解决spring mvc 多数据源切换,不支持事务控制的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-09-09
Springboot 2.x集成kafka 2.2.0的示例代码
kafka近几年更新非常快,也可以看出kafka在企业中是用的频率越来越高。本文主要为大家介绍了Springboot 2.x集成kafka 2.2.0的示例代码,需要的可以参考一下2022-04-04
Spring Boot与Kotlin处理Web表单提交的方法
本篇文章主要介绍了Spring Boot 与 Kotlin 处理Web表单提交的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-01-01
Druid(新版starter)在SpringBoot下的使用教程
Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,DruidDataSource支持的数据库,这篇文章主要介绍了Druid(新版starter)在SpringBoot下的使用,需要的朋友可以参考下2023-05-05
Java 使用JdbcTemplate 中的queryForList发生错误解决办法
这篇文章主要介绍了Java 使用JdbcTemplate 中的queryForList发生错误解决办法的相关资料,需要的朋友可以参考下2017-07-07


最新评论