【JAVA基础面经】String、StringBuffer、StringBuilder

文章目录

  • 前言
  • [String 的不可变性](#String 的不可变性)
  • [StringBuffer 可变且线程安全](#StringBuffer 可变且线程安全)
  • [StringBuilder 可变但线程不安全](#StringBuilder 可变但线程不安全)
  • 三者进行比较
  • 典型面试

前言

String 的不可变性

 String一旦创建,其内部 char 数组(Java 9 后为 byte )被 final 修饰,且没有提供任何修改内部状态的方法。任何看似修改的操作(如 concat( )、replace( )、+ 运算符)都会创建新的 String 对象。

java 复制代码
String s = "hello";
s = s + " world";  // 实际生成了新的 String 对象,原 "hello" 变成垃圾
  • 优点:线程安全、可以缓存 hashCode(适合作为 HashMap 的 key)、安全性(如类加载、网络连接等场景)。
  • 缺点:频繁拼接会产生大量临时对象,消耗内存和 GC 时间。

StringBuffer 可变且线程安全

 StringBuffer 继承自 AbstractStringBuilder,内部维护可变的字符数组

java 复制代码
StringBuffer sb = new StringBuffer("hello");
sb.append(" world");   // 直接在原对象上操作,不产生新对象

StringBuilder 可变但线程不安全

 与 StringBuffer API 完全相同,唯一区别是不加 synchronized。性能最高,是单线程字符串拼接的首选。

注意:如果多个线程同时访问,可能抛出异常或产生不可预料的结果。

三者进行比较

典型面试

1.String 为什么设计成不可变?

  • 字符串常量池的需要:多个引用指向同一个字符串常量时,一个修改不会影响其他引用。
  • 安全:类加载、数据库连接、文件路径等场景避免被篡改。
  • 线程安全:无需额外同步。
  • 哈希值可缓存:作为 HashMap 的 key 时效率高。

2.StringBuffer 与 StringBuilder 选择原则?

  • 单线程:优先 StringBuilder,没有同步开销,性能更好。
  • 多线程:用 StringBuffer,或使用 StringBuilder 并自行加锁(但更麻烦)。
java 复制代码
java 复制代码
java 复制代码
相关推荐
焦虑的说说3 小时前
秒杀系统设计方案
java
huangdong_3 小时前
淘宝商品SKU图自动分类技术深度解析:从DOM解析到智能归档
开发语言·javascript·ecmascript
阿正的梦工坊3 小时前
【Rust】12-借用检查器与非词法生命周期
开发语言·后端·rust
许彰午3 小时前
30_Java Stream流操作全解
java·windows·python
qq_2518364573 小时前
基于java Web网络订餐系统设计与实现 源码文档
java·开发语言·前端
秋93 小时前
3年经验Python后端转AI Engineer:3个月实战转型计划(2026版)
开发语言·人工智能·python
凡人叶枫3 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
飞天狗1114 小时前
零基础JavaWeb入门——第2课:让网页“活”起来 —— JSP是什么?
java·开发语言·前端·后端·web
梦@_@境4 小时前
面向 Spring Boot 的可观测业务流程编排引擎
java·spring boot·后端
云烟成雨TD4 小时前
Spring AI Alibaba 1.x 系列【77】执行取消
java·人工智能·spring