news 2026/5/14 13:38:29

《Java String 万字详解:从基础到面试,一篇吃透!》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《Java String 万字详解:从基础到面试,一篇吃透!》

一、String 基础与构造

String是 Java 中表示字符串的核心类,底层是不可变的字符数组(JDK9 + 为字节数组),每次修改都会生成新对象。

1. 三种常用构造方式

java运行

// 1. 常量串构造(最常用) String s1 = "hello"; // 2. new String对象 String s2 = new String("hello"); // 3. 字符数组构造 char[] arr = {'h','e','l','l','o'}; String s3 = new String(arr);

2. 常量池与 == /equals

  • ==:比较的是对象地址(是否为同一个对象)
  • equals():比较的是字符串内容是否相同

java运行

String s1 = new String("hello"); String s2 = new String("hello"); String s3 = "hello"; String s4 = "hello"; System.out.println(s1 == s2); // false(两个new对象,地址不同) System.out.println(s3 == s4); // true(常量池复用同一对象) System.out.println(s1.equals(s2)); // true(内容相同)

二、常用核心方法

1. 字符与索引相关

表格

方法功能注意事项
char charAt(int index)获取指定索引的字符索引从 0 开始,越界抛StringIndexOutOfBoundsException
int indexOf(int ch)字符第一次出现的位置没找到返回 - 1
int indexOf(String str)子串第一次出现的位置没找到返回 - 1
int lastIndexOf(int ch)字符最后一次出现的位置从后往前找,没找到返回 - 1

java运行

String s = "hello"; System.out.println(s.charAt(1)); // 'e' System.out.println(s.indexOf('l')); // 2 System.out.println(s.lastIndexOf('l')); // 3

2. 字符串分割 split ()

将字符串按指定分隔符拆分为数组,是开发中高频用法。

java运行

String s = "name=zhangsan&age=10"; // 第一次分割:按&拆分 String[] parts = s.split("&"); for (String part : parts) { // 第二次分割:按=拆分 String[] keyValue = part.split("="); System.out.println(keyValue[0] + ": " + keyValue[1]); } // 输出:name: zhangsan / age: 10

注意

  • 特殊字符(| * + .)需要转义,如按.拆分 IP 地址:split("\\.")
  • 多个分隔符用|连接,如split("&|=")

3. 字符串替换 replace ()

java运行

String s = "ababcabcd"; // 替换所有指定字符 String s1 = s.replace('a', 'k'); // "kbkbckbcd" // 替换所有指定子串 String s2 = s.replace("ab", "uuu"); // "uuuucuuucd" // 替换第一个匹配的子串 String s3 = s.replaceFirst("ab", "ooo"); // "oooabcabcd" // 替换所有匹配正则的子串(和replace区别是支持正则) String s4 = s.replaceAll("ab", "ooo"); // "oooocooocd"

4. 字符串截取 substring ()

java运行

String str = "helloworld"; // 从索引5截取到末尾 System.out.println(str.substring(5)); // "world" // 截取[0,5)区间(左闭右开,不包含结束索引) System.out.println(str.substring(0, 5)); // "hello"

5. 大小写转换与去空格

java运行

String s1 = "hello"; String s2 = "HELLO"; // 转大写 System.out.println(s1.toUpperCase()); // "HELLO" // 转小写 System.out.println(s2.toLowerCase()); // "hello" String s3 = " hello world "; // 去除前后空格(中间空格保留) System.out.println(s3.trim()); // "hello world"

6. 字符串与其他类型转换

(1)其他类型转字符串

java运行

// 数字、布尔、对象转字符串 String s1 = String.valueOf(1234); // "1234" String s2 = String.valueOf(12.34); // "12.34" String s3 = String.valueOf(true); // "true"
(2)字符串转数字

java运行

// 字符串转int int num1 = Integer.parseInt("1234"); // 1234 // 字符串转double double num2 = Double.parseDouble("12.34"); // 12.34
(3)字符串与字符数组互转

java运行

String s = "hello"; // 字符串转字符数组 char[] arr = s.toCharArray(); // ['h','e','l','l','o'] // 字符数组转字符串 String s2 = new String(arr); // "hello"

7. 字符串格式化 format ()

java运行

// 按指定格式拼接字符串,类似printf String date = String.format("%d-%d-%d", 2025, 5, 13); System.out.println(date); // "2025-5-13"

三、String、StringBuffer、StringBuilder 对比

这是面试高频考点,三者核心区别如下:

表格

可变性线程安全性能适用场景
String不可变-低(修改会生成新对象)少量字符串操作
StringBuffer可变安全(方法加synchronized较低多线程下频繁修改字符串
StringBuilder可变不安全单线程下频繁修改字符串

核心方法(StringBuffer/StringBuilder 通用)

java

运行

StringBuilder sb = new StringBuilder("hello"); // 追加内容 sb.append(" world"); // "hello world" // 插入内容 sb.insert(5, " my"); // "hello my world" // 删除字符 sb.deleteCharAt(0); // "ello my world" sb.delete(0, 5); // "y world" // 反转字符串 sb.reverse(); // "dlrow y" // 转为String String s = sb.toString();

四、高频面试题与避坑指南

1. 为什么 String 是不可变的?

  • 底层是private final char[] value(JDK9 + 为byte[]),数组本身被final修饰,引用不可变;
  • 所有修改方法(replace/substring等)都会返回新的String对象,不会修改原对象;
  • 不可变带来的好处:线程安全、常量池复用、哈希值缓存。

2.+拼接字符串的底层原理

  • 编译期优化:常量字符串拼接会直接合并为一个字符串(如"a"+"b""ab");
  • 运行期拼接:变量拼接会被编译为StringBuilderappend()操作,但循环中使用+会频繁创建StringBuilder对象,性能极差,应改用StringBuilder

3.split的特殊字符转义问题

  • 正则元字符(. | * + ?)作为分隔符时,必须用\\转义,如split("\\.")
  • 反斜杠\作为分隔符时,需写为split("\\\\")(Java 转义 + 正则转义)。

五、完整代码示例

java运行

public class StringTest { public static void main(String[] args) { // 1. 分割字符串 String s = "name=zhangsan&age=10"; String[] parts = s.split("&"); for (String part : parts) { String[] kv = part.split("="); System.out.println(kv[0] + ": " + kv[1]); } // 2. 替换字符串 String s2 = "ababcabcd"; System.out.println(s2.replace('a', 'k')); // 3. 字符串与数组转换 char[] arr = s2.toCharArray(); System.out.println(new String(arr)); // 4. StringBuilder拼接 StringBuilder sb = new StringBuilder(); sb.append("hello") .append(" ") .append("world") .reverse(); System.out.println(sb.toString()); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 13:38:27

NVLink故障诊断排查:多卡集群训练必看

多卡训练,NVLink是生命线。 NVLink带宽是PCIe的14倍,一旦出问题,训练效率断崖式下降。 诊断命令 # 查看拓扑 nvidia-smi topo -m # 查看NVLink状态 nvidia-smi nvlink --status -i 0 # 查看NVLink错误 nvidia-smi nvlink -s -i 0 拓扑显…

作者头像 李华
网站建设 2026/5/14 13:38:08

3分钟快速上手:AI图像分层工具layerdivider完全使用指南

3分钟快速上手:AI图像分层工具layerdivider完全使用指南 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为手动分离复杂图像图层而烦恼吗…

作者头像 李华
网站建设 2026/5/14 13:33:24

Midjourney Turbo模式全链路解析(Turbo不是“快”而是“准”):从提示词压缩、V6.1模型调度到GPU资源抢占机制

更多请点击: https://intelliparadigm.com 第一章:Turbo模式的本质重定义:从“加速幻觉”到“精度优先”范式迁移 传统 Turbo 模式常被误读为单纯提升吞吐量的“性能开关”,实则掩盖了其在现代异构计算栈中日益凸显的语义漂移——…

作者头像 李华
网站建设 2026/5/14 13:33:23

漫画翻译革命:BallonsTranslator如何让外文漫画阅读变得轻松简单?

漫画翻译革命:BallonsTranslator如何让外文漫画阅读变得轻松简单? 【免费下载链接】BallonsTranslator 深度学习辅助漫画翻译工具, 支持一键机翻和简单的图像/文本编辑 | Yet another computer-aided comic/manga translation tool powered by deeplearn…

作者头像 李华
网站建设 2026/5/14 13:32:31

NXP S32K144实战指南:S32DS高效调试与界面布局优化

1. S32DS界面布局优化实战 第一次打开S32DS时,满屏的窗口和工具栏确实容易让人眼花缭乱。经过多个项目的实战,我发现合理的界面布局能让开发效率提升至少30%。先说说我的标准配置方案: 左侧固定放置Project Explorer和Outline窗口。Project E…

作者头像 李华