当前位置: 首页 > news >正文

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() 是安全的

小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)

…。。。。。。。。。。。…
请添加图片描述

…。。。。。。。。。。。…

http://www.dtcms.com/a/347303.html

相关文章:

  • 山西某焦化厂炼焦区电气维护系统无线传输解决方案实施案例
  • Mangio RVC Fork 本地部署(Cuda12.9)
  • 蓝牙aoa仓库管理系统功能介绍
  • 有哪些Spring Boot微服务架构成功落地的案例?
  • GitHub发布革命性工具:GitHub Spark,用自然语言打造全栈智能应用
  • yolo命令行-训练篇(三)
  • Android安卓学习日志1 聊一聊安卓的历史和笔者的想法
  • 微服务统一入口——Gateway
  • 航空复杂壳体零件深孔检测方法 - 激光频率梳 3D 轮廓检测
  • 把 AI 塞进「自行车码表」——基于 MEMS 的 3D 地形预测码表
  • 基础IO
  • electron进程间通信-IPC通信注册机制
  • SAP FI 应收应付账龄分析
  • MySQL 锁的详解:从 InnoDB 到死锁诊断实战
  • Hive Metastore和Hiveserver2启停脚本
  • 爱普生打印机的使用
  • day40-tomcat
  • UE C++ 堆化
  • 【卫星通信】超低码率语音编码ULBC:EnCodec神经音频编解码器架构深度解析
  • 随机森林2——集成学习的发展
  • TCP:传输控制协议
  • JAVA核心基础篇-递归
  • C 语言标准输入输出头文件stdio.h及其常见用法
  • 【读论文】Qwen-Image技术报告解读
  • 云原生高级——K8S总概
  • ArkTS 语言全方位解析:鸿蒙生态开发新选择
  • 双指针:成最多水的容器
  • 使用 eventpp 构建跨 RT-Thread 与 ARM-Linux 的轻量级 Active Object(AO)事件驱动框架
  • AI Agent系列(十三) -智能体架构的真相
  • LoRA 微调