Java基础面试题(04)—Java(Java中String StringBuffer 和 StringBuilder的区别)
前言
学习项目的过程中,我觉得自己有点太急功近利了一直跟着视频敲没有自己的思考(主要是最近在牛客读到了一位大佬👍👍👍,程序员牛肉的文章),🙌学技术不是一味的复制粘贴,特别是做项目,要边学边思考,一个功能的实现,我学会了什么技术,还有没有更好的可以替代它。
之前学的基础知识其实也没有学完,像集合,线程… 都还不知道是啥就开始学JavaWeb做项目了,在项目中使用队列存储我都一脸懵,在这里以问题的形式写一个学习笔记🤔,不仅仅是复习,也为以后的面试做准备,还有还有我的刷题网站是面试鸭呦🦆🦆🦆
Java中String StringBuffer 和 StringBuilder的区别?
1)String
- 不可变:String是不可变类,字符串一旦创建,其内容无法更改。每次对String进行修改操作,都会创建新的String对象。
- 适合场景:字符串内容不会频繁变化的场景,例如:少量的字符串拼接操作或字符串常量。
2)StringBuffer
- 可变:StringBuffer是可变的,可以进行字符串的追加,删除,插入等操作。
- 线程安全:StringBuffer是线程安全的,内部使用了synchronized关键字来保证多线程环境下的安全性。
- 适合场景:StringBuffer适合于多线程环境中需要频繁修改字符串的场景。
3)StringBuilder
- 可变:StringBuilder也是可变的,提供了与StringBuffer类似的操作接口。
- 非线程安全:StringBuilder不保证线程安全,性能比StringBuffer更高。
- 适用场景:StringBuilder适用于单线程中的高性能字符串处理。
总结:
- String:不可变,适合少量字符串操作。
- StringBuffer:可变且线程安全,适合多线程环境中的频繁字符串修改。
- StringBuilder:可变且非线程安全,适合单线程环境中的高性能字符串处理。
🧩扩展
String、StringBuffer 和 StringBuilder 的用法:
一 ,String —— 不可变字符串
常见用法:
✅ 定义常量
public static final String DEFAULT_CHARSET = "UTF-8";
public static final String LINE_SEPARATOR = System.getProperty("line.separator");
✅ 字符串比较
String command = "start";
if ("start".equals(command)) { // 推荐写法(避免空指针)System.out.println("启动服务");
}
✅ 格式化输出
String name = "小明";
int age = 18;
String info = String.format("姓名: %s, 年龄: %d", name, age);
✅ 分割、提取
String data = "apple,banana,orange";
String[] fruits = data.split(","); // ["apple", "banana", "orange"]String text = "Hello World";
String sub = text.substring(0, 5); // "Hello"
二、StringBuilder —— 可变字符串
常见方法
✅ append(…):追加内容
StringBuilder sb = new StringBuilder();
sb.append("姓名: ").append("小明");
sb.append(", 年龄: ").append(18);
sb.append(", 成绩: ").append(95.5);
System.out.println(sb.toString());
// 输出: 姓名: 小明, 年龄: 18, 成绩: 95.5
✅ insert(int offset, …):插入
StringBuilder sb = new StringBuilder("HelloWorld");
sb.insert(5, " "); // 在索引5处插入空格
System.out.println(sb); // Hello World
✅ delete(int start, int end):删除
StringBuilder sb = new StringBuilder("Hello World");
sb.delete(5, 6); // 删除索引5到6(不包括6)的字符
System.out.println(sb); // HelloWorld
✅ replace(int start, int end, String str):替换
StringBuilder sb = new StringBuilder("Hello World");
sb.replace(6, 11, "Java");
System.out.println(sb); // Hello Java
✅ reverse():反转
StringBuilder sb = new StringBuilder("abc");
sb.reverse();
System.out.println(sb); // cba
✅ length() 和 capacity()
StringBuilder sb = new StringBuilder("hi");
System.out.println(sb.length()); // 2(当前字符数)
System.out.println(sb.capacity()); // 18(总容量 = 16 + 2)
三、StringBuffer —— 线程安全的可变字符串
这个方法什么的跟Builder差不多,只是底层所有方法都加了 synchronized 关键字,保证多线程环境下调用 append、delete 等方法时不会出错
使用例子(多线程场景)
public class ThreadSafeBuilder {private StringBuffer buffer = new StringBuffer("日志: ");public void log(String msg) {buffer.append("[").append(Thread.currentThread().getName()).append("] ");buffer.append(msg).append("\n");}public String getLogs() {return buffer.toString();}
}// 多个线程调用 log() 是安全的
小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)
…。。。。。。。。。。。…
…。。。。。。。。。。。…