
🏠个人主页:黎雁
🎬作者简介:C/C++/JAVA后端开发学习者
❄️个人专栏:C语言、数据结构(C语言)、EasyX、JAVA、游戏、规划、程序人生
✨ 从来绝巘须孤往,万里同尘即玉京

文章目录
- [✨Java字符串系列总结篇|核心知识点速记手册 笔试开发全覆盖 ✅](#✨Java字符串系列总结篇|核心知识点速记手册 笔试开发全覆盖 ✅)
-
- [📌 文章摘要](#📌 文章摘要)
-
- [🕒 阅读时长](#🕒 阅读时长)
- [✅ 适用人群](#✅ 适用人群)
- [一、API基础核心 ✨ 入门必备](#一、API基础核心 ✨ 入门必备)
- [二、三大字符串核心类 🔥 核心用法与考点](#二、三大字符串核心类 🔥 核心用法与考点)
-
- [2.1 String类(基础核心,不可变)](#2.1 String类(基础核心,不可变))
- [2.2 StringBuilder类(高效操作核心,可变)](#2.2 StringBuilder类(高效操作核心,可变))
- [2.3 StringJoiner类(格式化拼接专用,JDK8+)](#2.3 StringJoiner类(格式化拼接专用,JDK8+))
- [2.4 三类工具类选择原则(开发必遵)](#2.4 三类工具类选择原则(开发必遵))
- [三、底层核心原理 🔍 笔试面试必考](#三、底层核心原理 🔍 笔试面试必考)
-
- [3.1 String拼接底层优化](#3.1 String拼接底层优化)
- [3.2 字符串常量池(StringTable)核心](#3.2 字符串常量池(StringTable)核心)
- [3.3 关键底层关系](#3.3 关键底层关系)
- [四、经典面试题核心答案 📝 零失分速记](#四、经典面试题核心答案 📝 零失分速记)
-
- [1. String为什么是不可变的?](#1. String为什么是不可变的?)
- [2. ==和equals的区别?String的equals做了什么?](#2. ==和equals的区别?String的equals做了什么?)
- [3. String、StringBuilder、StringBuffer的区别?](#3. String、StringBuilder、StringBuffer的区别?)
- [4. new String("abc")创建几个对象?](#4. new String("abc")创建几个对象?)
- [5. StringBuilder的初始容量和扩容规则?](#5. StringBuilder的初始容量和扩容规则?)
- [6. 以下代码输出什么?](#6. 以下代码输出什么?)
- [五、开发高频规范与坑点规避 ❌ 写出优质代码](#五、开发高频规范与坑点规避 ❌ 写出优质代码)
-
- [5.1 核心开发规范(必遵)](#5.1 核心开发规范(必遵))
- [5.2 高频坑点速避](#5.2 高频坑点速避)
- [六、全系列核心思想 📚 知识闭环](#六、全系列核心思想 📚 知识闭环)
✨Java字符串系列总结篇|核心知识点速记手册 笔试开发全覆盖 ✅
📌 文章摘要
本文是Java字符串三篇系列博客的核心知识点总结篇 ,纯干货无冗余,精准摘取API使用、三大核心类、底层原理、笔试考点、开发规范等所有重要知识点,按基础→核心→原理→规范逻辑梳理,形成可直接背诵的速记手册。覆盖String、StringBuilder、StringJoiner全类核心考点,吃透字符串拼接优化、串池机制、面试高频题等关键内容,适配笔试快速复盘、开发随时查阅,助力实现Java字符串知识闭环。
🕒 阅读时长
约8分钟
✅ 适用人群
Java零基础入门者、笔试面试备考者、开发入门夯实基础者、复习巩固速记人群
一、API基础核心 ✨ 入门必备
- API:应用程序编程接口,JDK预定义的工具类/方法,直接调用无需关心底层实现;
- Java API:JDK提供的各类核心类(如String、Scanner),封装底层实现,是开发核心工具;
- API帮助文档使用:索引输入类名→查看包路径、构造方法、成员方法(参数+返回值+说明是核心);
- 包路径规则 :
java.lang包下类(String、StringBuilder)无需导包,java.util包下类(StringJoiner)需手动导包。
二、三大字符串核心类 🔥 核心用法与考点
2.1 String类(基础核心,不可变)
核心特性
- 代表字符串,所有双引号文字都是其对象,内容一旦创建不可变 (底层
private final char[] value保证); - 不可变本质:变量"修改"是指向新对象,会产生冗余对象,拼接有变量时效率极低。
创建方式与内存
| 创建方式 | 内存特点 | 串池交互 | 效率 |
|---|---|---|---|
直接赋值 String s="abc" |
串池存储 | 复用(有则直接用,无则创建) | 最高 |
new创建 new String("abc") |
堆存储新对象 | 先创建/复用串池对象,再堆新建 | 低,产生1-2个对象 |
| 字符/字节数组创建 | 堆存储新对象 | 无交互,不复用 | 一般,适合特定场景 |
核心方法(必背)
charAt(int index):根据索引取字符,索引从0开始;length():获取字符串长度(方法,区别于数组length属性);substring(int b[, int e]):截取字符串,左闭右开,返回新对象;replace(CharSequence t, CharSequence r):替换内容,返回新对象;equals(Object o):重写后比较内容,区分大小写;equalsIgnoreCase(String s):忽略大小写比较内容。
比较规则
==:基本类型比值 ,引用类型(String)比地址;equals/equalsIgnoreCase:比较字符串内容,开发必用。
2.2 StringBuilder类(高效操作核心,可变)
核心特性
- 可变字符串容器,所有操作在同一个容器中进行,无冗余对象,专为拼接/反转设计;
- 底层封装可变字节数组,
java.lang包无需导包,打印直接输出内容(特殊处理)。
核心构造与方法
- 构造方法:空参(默认容量16)、带参(容量=初始字符串长度+16);
- 核心方法 (均返回对象本身,支持链式调用 ):
append(任意类型):添加数据,核心拼接方法;reverse():反转容器内容;length():获取有效字符数(非底层容量);toString():转换为String类型,仅最终需要时调用一次。
底层扩容规则(笔试必考)
- 有效长度超容量时自动扩容,JDK8+规则:
- 新长度≤原容量×2+2 → 扩容为原容量×2+2;
- 新长度>原容量×2+2 → 直接扩容为实际需要长度;
- 扩容仅创建一次新数组,远优于String的多次对象创建。
适用场景
- 单线程下所有批量字符串操作 ,尤其是循环拼接(开发规范);
- 字符串反转、无格式要求的拼接。
2.3 StringJoiner类(格式化拼接专用,JDK8+)
核心特性
- 可变字符串容器,底层封装StringBuilder,专为带格式拼接设计;
java.util包必须导包,JDK8及以后才支持。
核心构造与方法
- 构造方法:指定分隔符、指定分隔符+前缀+后缀(核心优势);
- 核心方法 (支持链式调用):
add(CharSequence s):添加字符串内容;length():获取总长度(包含分隔符、前缀、后缀);toString():返回拼接后的String对象。
适用场景
- 带分隔符的拼接(如a---b---c);
- 带前后缀的格式化拼接(如[1,2,3]);
- 数组/集合元素的格式化输出。
2.4 三类工具类选择原则(开发必遵)
- 简单使用/无修改拼接:String直接赋值(编译期优化,复用串池);
- 循环拼接/反转/无格式批量操作:StringBuilder(高效通用);
- 带分隔符/前后缀格式化拼接:StringJoiner(代码简洁);
- 多线程批量操作:StringBuffer(线程安全,方法加synchronized,效率低于StringBuilder)。
三、底层核心原理 🔍 笔试面试必考
3.1 String拼接底层优化
- 无变量参与(纯常量) :编译期优化,直接合并为最终字符串,复用串池,效率与StringBuilder一致;
- 有变量参与(变量/方法调用) :运行时处理(JDK8+),每次拼接创建新StringBuilder+String对象,循环中极度低效,必须用StringBuilder替代。
3.2 字符串常量池(StringTable)核心
- 存储:仅存储字符串常量,是JVM的字符串缓存区域;
- 位置:JDK7及以后从方法区迁移到堆内存;
- 规则:池中有则复用,无则创建,仅直接赋值/编译期优化的常量参与串池。
3.3 关键底层关系
- String不可变:
final修饰字符数组引用(不能指向新数组)+ 属性私有化 + 无修改方法; - StringJoiner与StringBuilder:前者是后者的上层封装,高效性源于StringBuilder;
- 容量vs长度:StringBuilder的容量 是底层数组总长度(隐藏),长度是实际有效字符数(length()获取)。
四、经典面试题核心答案 📝 零失分速记
1. String为什么是不可变的?
- 底层
private final char[] value,final保证数组引用不可变; - 字符数组私有化,外部无法直接访问修改;
- 无公共修改数组内容的方法,所有修改均返回新对象。
2. ==和equals的区别?String的equals做了什么?
==:基本类型比値,引用类型比地址;- equals:Object类默认比地址,String重写后逐字符比较内容;
- 补充:equalsIgnoreCase忽略大小写比较内容。
3. String、StringBuilder、StringBuffer的区别?
- String:不可变,线程安全(天然),拼接有变量时效率低;
- StringBuilder:可变,非线程安全,效率最高,单线程首选;
- StringBuffer:可变,线程安全(方法加锁),效率较低,多线程首选。
4. new String("abc")创建几个对象?
- 1个或2个;串池已有"abc"→仅堆创建1个;串池无→串池1个+堆1个,共2个。
5. StringBuilder的初始容量和扩容规则?
- 初始容量:空参16,带参=初始字符串长度+16;
- 扩容规则:有效长度超容量时,≤原容量×2+2则扩为原容量×2+2,否则扩为实际需要长度。
6. 以下代码输出什么?
java
String s1="abc"; String s2="a"+"b"+"c"; String s3=new String("abc");
System.out.println(s1==s2); // true(编译期优化)
System.out.println(s1==s3); // false(new创建堆对象)
五、开发高频规范与坑点规避 ❌ 写出优质代码
5.1 核心开发规范(必遵)
- 比较字符串内容永远用equals/equalsIgnoreCase,禁止用==;
- 循环中拼接字符串必须用StringBuilder,禁止用String的+;
- 纯常量拼接直接用String赋值,无需过度使用StringBuilder;
- StringBuilder的toString()仅最终需要时调用一次,禁止循环中调用;
- 带格式拼接用StringJoiner,无格式用StringBuilder,各司其职。
5.2 高频坑点速避
- 混淆String的
length()方法和数组的length属性; - 使用StringJoiner忘记导包(
java.util); - 理解错substring的左闭右开规则;
- 把StringBuilder的length()当作底层容量;
- 频繁创建StringBuilder对象,未复用单个容器;
- 多线程下用StringBuilder(应使用StringBuffer)。
六、全系列核心思想 📚 知识闭环
- 效率核心:减少对象创建,优先复用串池,循环拼接用可变容器;
- 选择核心 :根据场景+格式+线程选择工具类,无银弹;
- 原理核心:String的不可变是所有优化的出发点,StringBuilder的可变是高效的本质;
- 开发核心:遵循规范,规避坑点,让代码既高效又优雅。
本文为Java字符串系列纯干货总结,所有知识点均为笔试、面试、开发高频考点,建议点赞+收藏,作为日常复习和开发查阅的速记手册。后续将持续更新Java核心知识点系列,关注不迷路,一起夯实Java基础,进阶开发之路!