string常用方法需按行为归类理解:查(indexof/contains/endswith)、取(charat/substring/tochararray)、变(replace/tolowercase/trim)、判(equals/compareto);核心设计意图是不可变性(final char[]/byte[]+新对象返回)、常量池优化、null安全及编码明确性,高频源码点包括intern()机制、substring实现演进与equals逻辑。

背 Java String 常用方法和源码面试题,不是靠死记硬背 API 名字和参数顺序,而是理解行为逻辑 + 抓住关键设计意图 + 关联典型场景。下面分四块说清楚怎么高效准备:
一、按“行为类别”归类记忆,不零散罗列
把几十个方法收拢成几类,每类记住 2–3 个核心代表 + 它们的关键区别:
-
查:indexOf / lastIndexOf / contains / startsWith / endsWith
共性:都返回int或boolean,底层都是遍历 char 数组比对;contains实际调用indexOf >= 0;endsWith是startsWith(suffix, value.length - suffix.length) -
取:charAt / substring / toCharArray / getBytes
charAt直接数组索引访问(带越界检查);substring是拷贝新 char 数组(JDK 7 后不再共享底层数组);toCharArray返回新数组,原字符串不受影响 -
变:replace / replaceAll / toLowerCase / trim / concat
所有方法都返回新 String(体现不可变性);replace是字符级替换,replaceAll是正则替换;trim只去首尾U+0020及 ASCII 控制字符,不去中间空格 -
判:equals / equalsIgnoreCase / compareTo
equals先判引用相等,再判长度、逐字符比较;equalsIgnoreCase转成大写再比(注意 locale 敏感);compareTo按 Unicode 值逐字符减法,返回正/负/0
二、重点盯住 5 个高频源码细节(面试必问)
这些不是让你背整段代码,而是掌握关键逻辑和设计原因:
-
String 为什么不可变?
因为private final char[] value(JDK 9+ 改为byte[]+coder),且所有构造/操作方法都拷贝新数组,不暴露修改入口 -
new String("abc") 创建几个对象?
常量池已有 "abc" → 1 个(堆中 new 出的对象);常量池无 "abc" → 2 个(池中放入 + 堆中 new) -
substring 怎么实现的?
JDK 7 以前共享底层数组(有内存泄漏风险);JDK 7+ 改为Arrays.copyOfRange拷贝新数组,彻底隔离 -
equals 和 == 的本质区别?
==比地址(引用是否同一对象);equals比内容(字符序列是否一致),且 null 安全(先判 this == null) -
intern() 干什么?
如果常量池已有该字符串,返回池中引用;否则把当前字符串加入池并返回其引用。常用于减少重复字符串内存占用
三、用“对比题”代替单点记忆
面试最爱考辨析,提前练熟这些组合:
-
str1.equals(str2)vsstr1 == str2→ 看是否同一个对象 vs 内容是否相同 -
str.replace('a', 'b')vsstr.replaceAll("a", "b")→ 字符替换 vs 正则替换(前者不走 regex 引擎) -
str.substring(2)vsstr.substring(2, 5)→ 从索引 2 到末尾 vs 从 2 到 4(左闭右开) -
"abc".getBytes()vs"abc".getBytes(StandardCharsets.UTF_8)→ 前者依赖平台默认编码(可能跨环境出错),后者明确指定,推荐 -
str.concat("x")vsstr + "x"→ 底层都生成 StringBuilder,但后者在编译期可能优化为常量拼接
四、自己动手验证,比看十遍更牢
别光读源码,敲几行代码跑一跑:
- 写个循环测试
substring(0, s.length())是否等于原字符串(是,且是同一个对象) - 打印
"ab".concat("cd").hashCode()和"abcd".hashCode(),确认 hash 计算一致 - 用
javap -c看"a" + "b"编译后是不是直接变成"ab"(常量折叠) - 调试
new String(new char[]{'h','e','l','l','o'}),观察构造方法里Arrays.copyOf的调用
不复杂但容易忽略——真正能答好 String 面试题的人,不是 API 背得最全的,而是能讲清「为什么这样设计」「改了会怎样」「哪里容易踩坑」。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











