
前言String、StringBuilder、StringBuffer 是Java面试最基础、出场率最高的知识点。大部分面试官都会询问三者区别、底层原理、线程安全以及使用场景。我整理了一套完整的面试知识点通俗易懂适合面试复习也适合新手巩固Java基础。一、三者核心区别总结1.可变性String不可变字符串StringBuilder可变字符串StringBuffer可变字符串2.线程安全String线程安全StringBuilder非线程安全StringBuffer线程安全3.性能String拼接效率最低StringBuilder单线程效率最高StringBuffer多线程安全效率略低4.适用场景String少量字符串定义、静态文本、常量StringBuilder单线程环境大量字符串拼接StringBuffer多线程环境大量字符串拼接二、底层原理讲解1.为什么String不可变String底层使用被final修饰的char数组存储数据数组一旦初始化完成无法修改数组地址和内部数据。每次对字符串进行拼接、替换、截取操作都不会修改原字符串而是生成一个全新的String对象。String不可变的优点1.可以支持字符串常量池节省大量内存2.天然线程安全多线程共享不会出现数据错乱3.哈希值固定非常适合作为HashMap的key2.StringBuilder和StringBuffer可变原理两者底层都继承自AbstractStringBuilder底层使用普通char数组没有final修饰。拼接字符串时直接在原数组上修改不会创建新对象同时自带数组自动扩容机制所以拼接性能远高于String。三、线程安全区别StringBuffer 的所有 append、修改方法都加入了 synchronized 同步锁保证多线程并发操作时数据不会丢失、错乱所以是线程安全的。StringBuilder 没有任何锁机制多线程同时拼接字符串会出现覆盖、数据丢失问题不支持多线程但是因为没有锁开销单线程性能最好。String不可修改不存在并发修改问题所以线程安全。四、开发规范与代码示例1.不推荐循环内使用String拼接javaString str ;for (int i 0; i 1000; i) {str i;}循环中使用加号拼接每一次循环都会创建新的字符串对象产生大量无效垃圾对象占用内存GC频繁性能极差。2.单线程推荐使用StringBuilderjavaStringBuilder sb new StringBuilder();for (int i 0; i 1000; i) {sb.append(i);}String str sb.toString();只会创建一个对象全程在原数组扩容修改性能极高日常开发拼接字符串首选。3.多线程场景使用StringBufferjavaStringBuffer sb new StringBuffer();new Thread(() - {for (int i 0; i 500; i) {sb.append(a);}}).start();new Thread(() - {for (int i 0; i 500; i) {sb.append(b);}}).start();五、面试高频问答1. String为什么不可变底层是final修饰的字符数组无法修改原有对象。不可变可以保证常量池复用、线程安全、哈希值稳定。2. StringBuilder和StringBuffer区别StringBuffer方法加锁线程安全但性能低StringBuilder无锁线程不安全但性能高。单线程用StringBuilder多线程用StringBuffer。3. 循环拼接字符串用什么绝对不要用String加号拼接循环内统一使用StringBuilder提升程序性能减少内存占用。六、总结1.简单静态字符串直接使用String。2.所有循环拼接、大量字符串拼接优先使用StringBuilder。3.只有多线程共享拼接对象时才使用StringBuffer。