我们来系统地梳理一下 Java 中的字符串操作。Java 的字符串操作非常丰富,主要涉及到 StringStringBuilder 和 StringBuffer 这三个核心类。


目录

一、核心类简介

二、String 类的常用操作

1. 创建字符串

2. 获取基本信息

3. 比较字符串

4. 查找与判断

5. 转换与替换

6. 分割与连接

三、StringBuilder / StringBuffer 的常用操作

1. 创建对象

2. 修改字符串(核心功能)

四、性能对比:+ 拼接 vs StringBuilder

1.错误示例:使用 + 拼接

2.正确示例:使用 StringBuilder


一、核心类简介

在开始具体操作前,先理解这三个类的区别至关重要:

import java.lang.StringBuilder;
特性线程安全性能适用场景
String不可变 (Immutable)较低(每次修改都创建新对象)字符串内容不需要改变的场景,如作为常量、Map 的键等。
StringBuilder可变 (Mutable)最高单线程环境下,需要频繁修改字符串内容(拼接、删除、替换等)。
StringBuffer可变 (Mutable)较低(因为有同步开销)多线程环境下,需要安全地修改字符串内容。

核心结论:

  • 如果字符串内容不改变,用 String
  • 如果在单线程下需要频繁修改字符串,用 StringBuilder
  • 如果在多线程下需要安全地修改字符串,用 StringBuffer

二、String 类的常用操作

String 类提供了大量用于处理字符串的方法。

1. 创建字符串
// 1. 直接赋值 (推荐,JVM 会有字符串常量池优化)
String str1 = "Hello Java";// 2. 使用 new 关键字 (会创建新的对象,不推荐)
String str2 = new String("Hello Java");
2. 获取基本信息
String str = "Hello World";
System.out.println(str.length());         // 获取长度: 11
System.out.println(str.isEmpty());        // 判断是否为空字符串: false
System.out.println(str.charAt(0));        // 获取指定索引的字符: 'H'
System.out.println(str.indexOf('W'));     // 查找字符 'W' 的索引: 6
System.out.println(str.indexOf("World")); // 查找子串 "World" 的索引: 6
System.out.println(str.lastIndexOf('o')); // 从后向前查找字符 'o' 的索引: 7
3. 比较字符串
String s1 = "hello";
String s2 = "world";
String s3 = "Hello";// 1. equals() : 比较内容是否相等 (区分大小写)
System.out.println(s1.equals(s2)); // false// 2. equalsIgnoreCase() : 比较内容是否相等 (不区分大小写)
System.out.println(s1.equalsIgnoreCase(s3)); // true// 3. compareTo() : 比较字典顺序
// s1 < s2 返回负数, s1 == s2 返回 0, s1 > s2 返回正数
System.out.println(s1.compareTo(s2)); // -15 (h 的 ASCII 码比 w 小)// 4. == : 比较的是两个对象的内存地址 (是否是同一个对象)
String s4 = "hello";
String s5 = new String("hello");
System.out.println(s1 == s4); // true (字符串常量池,指向同一个对象)
System.out.println(s1 == s5); // false (new 创建了新对象,地址不同)
4. 查找与判断
String str = "This is a test string.";System.out.println(str.contains("test"));  // 判断是否包含子串: true
System.out.println(str.startsWith("This")); // 判断是否以指定前缀开头: true
System.out.println(str.endsWith("ing."));  // 判断是否以指定后缀结尾: true
System.out.println(str.substring(5));     // 从索引 5 开始截取到末尾: "is a test string."
System.out.println(str.substring(5, 7));   // 截取 [5, 7) 区间: "is"
5. 转换与替换
String str = "  Hello  World  ";// 1. trim() : 去除首尾空格
System.out.println(str.trim()); // "Hello  World"// 2. toUpperCase() / toLowerCase() : 大小写转换
System.out.println(str.toUpperCase()); // "  HELLO  WORLD  "
System.out.println(str.toLowerCase()); // "  hello  world  "// 3. replace() : 替换字符或子串
// 注意:String 不可变,replace() 返回一个新字符串
String newStr = str.replace('l', 'p');
System.out.println(newStr); // "  Heppo  Worpd  "
System.out.println(str.replace("World", "Java")); // "  Hello  Java  "
6. 分割与连接
String str = "apple,banana,orange,grape";// 1. split() : 分割字符串,返回一个字符串数组
String[] fruits = str.split(",");
// fruits: ["apple", "banana", "orange", "grape"]
System.out.println(Arrays.toString(fruits));// 2. join() : 连接字符串 (静态方法)
String result = String.join("-", "apple", "banana", "orange");
// result: "apple-banana-orange"
System.out.println(result);

三、StringBuilder / StringBuffer 的常用操作

它们的方法几乎完全一样,区别在于线程安全。这里以 StringBuilder 为例。

1. 创建对象
StringBuilder sb = new StringBuilder(); // 默认容量 (16)
StringBuilder sb2 = new StringBuilder("Hello"); // 初始内容
2. 修改字符串(核心功能)
StringBuilder sb = new StringBuilder("Hello");// 1. append() : 追加内容
sb.append(" World");
System.out.println(sb); // "Hello World"// 2. insert() : 在指定位置插入内容
sb.insert(5, ","); // 在索引 5 的位置插入 ","
System.out.println(sb); // "Hello, World"// 3. delete() : 删除指定区间的内容
sb.delete(5, 7); // 删除 [5, 7) 区间,即删除 ", "
System.out.println(sb); // "HelloWorld"// 4. replace() : 替换指定区间的内容
sb.replace(5, 10, " Java"); // 替换 [5, 10) 区间为 " Java"
System.out.println(sb); // "Hello Java"// 5. reverse() : 反转字符串
sb.reverse();
System.out.println(sb); // "avaJ olleH"// 6. toString() : 转换为 String 对象
String finalString = sb.toString();
System.out.println(finalString); // "avaJ olleH"

四、性能对比:+ 拼接 vs StringBuilder

在循环中频繁使用 + 拼接字符串是 Java 新手常见的性能陷阱。

1.错误示例:使用 + 拼接
String result = "";
for (int i = 0; i < 10000; i++) {result = result + i; // 每次循环都会创建一个新的 String 对象,性能极差!
}
2.正确示例:使用 StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {sb.append(i); // 在同一个对象上追加,性能极高!
}
String result = sb.toString();

原因分析:

  • result + i 的过程实际上是:new StringBuilder().append(result).append(i).toString()。每次循环都会创建一个 StringBuilder 和一个新的 String 对象,导致大量内存浪费和 GC(垃圾回收)压力。
  • StringBuilder 的 append 方法是在一个预先分配好空间的字符数组上进行操作,避免了频繁创建新对象的开销。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96124.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96124.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96124.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习基础】PyTorch Tensor生成方式及复制方法详解

目录PyTorch Tensor生成方式及复制方法详解一、Tensor的生成方式&#xff08;一&#xff09;从Python列表/元组创建&#xff08;二&#xff09;从NumPy数组创建&#xff08;三&#xff09;特殊初始化方法&#xff08;四&#xff09;从现有Tensor创建&#xff08;五&#xff09;…

动态规划:入门思考篇

1. 简单类比 假如我们要求全国人数&#xff0c;那么我们只要知道各个省的人数&#xff0c;然后将各个省的人数相加即可&#xff0c;要想知道各个省的人数&#xff0c;只要将这个省下面所有的市人数相加即可&#xff0c;同样&#xff0c;如果想要知道各个市的人数&#xff0c;只…

小杨的 X 字矩阵(举一反三)-洛谷B3865 [GESP202309 二级]

题目描述 小杨想要构造一个 X 字矩阵&#xff08; 为奇数&#xff09;&#xff0c;这个矩阵的两条对角线都是半角加号 &#xff0c;其余都是半角减号 - 。例如&#xff0c;一个 55 的 X 字矩阵如下&#xff1a; --- --- ---- --- --- 请你帮小杨根据给定的 打印出对应的“X …

数据组合与合并:Pandas 数据整合全指南 +缺失值处理

数据组合与合并&#xff1a;Pandas 数据整合全指南在进行数据分析之前&#xff0c;数据清洗与整合是关键步骤。 遵循“整洁数据”&#xff08;Tidy Data&#xff09;原则&#xff1a; 每个观测值占一行每个变量占一列每种观测单元构成一张独立的表格 整理好数据后&#xff0c;常…

c#联合halcon的基础教程(案例:亮度计算、角度计算和缺陷检测)(含halcon代码)

目录 1.环境配置 2.案例一&#xff1a;亮度计算 halcon代码&#xff1a; 主界面代码&#xff1a; 3.案例二&#xff1a; 角度计算 halcon代码&#xff1a; 主界面代码&#xff1a; 4.案例三&#xff1a;缺陷检测 halcon代码&#xff1a; 主界面代码&#xff1a; 通过…

大数据云原生是什么

"云原生"&#xff08;Cloud Native&#xff09;指的是‌利用云计算原生优势&#xff08;弹性、按需服务、自动化、分布式等&#xff09;来设计、构建、部署和运行大数据应用和工作负载的方法论与技术体系‌。它不是简单地“把大数据平台搬到云上”&#xff0c;而是从…

Pytest项目_day16(yaml和parametrize结合)

查询手机号归属地 我们首先可以在YAML文件中定义测试数据 方式一&#xff0c;使用- 注意&#xff1a;当我们需要一次传入两个参数时&#xff0c;需要定义两层迭代&#xff0c;即两层列表不够直观&#xff0c;容易写错 输出的结果为&#xff1a; 然后我们可以将测试数据传入test…

【Nginx指南】从核心原理到生产实践

目录Nginx指南&#xff1a;从核心原理到生产实践引言&#xff1a;Nginx在现代架构中的核心地位一、Nginx核心能力与应用场景1.1 多场景适配的全能型中间件1.2 技术优势&#xff1a;Nginx成为行业标准的关键二、Nginx安装部署&#xff1a;源码编译与包管理方案2.1 源码编译&…

物体检测

目录 1 目标定位 2 地标检测 3 目标检测 4 在卷积网络上实现滑动窗口 5 边界框预测 6 交并比 7 非极大值抑制 8 锚框 9 YOLO算法 10 用u-net进行语义分割 11 转置卷积 12 u-net 结构灵感 1 目标定位 你已经对图片分类有所了解。例如通过这张图片可以识…

es7.x es的高亮与solr高亮查询的对比对比说明

一 solr&es高亮1.1 solr与es高亮功能解释说明&#xff1a;1)高亮配置&#xff1a;fragmentSize(1000) 设置片段长度numOfFragments(1) 指定返回的片段数量preTags() 和 postTags() 设置高亮标记2)字段处理差异&#xff1a;在 ES 中&#xff0c;使用 matchQuery 而非 termQ…

DSP音频算法工程师技能2

一、核心知识准备1. 算法原理3A算法&#xff08;AGC自动增益控制/AEC回声消除/ANS降噪&#xff09;&#xff1a;掌握AEC的NLMS/双讲检测原理&#xff0c;ANS的谱减法/维纳滤波&#xff0c;AGC的压缩曲线设计。熟悉Speex/WebRTC等开源实现。EQ音效&#xff1a;IIR/FIR滤波器设计…

第4章-04-用WebDriver页面元素操作

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

【计算机视觉与深度学习实战】04基于K-Means聚类的图像分割系统设计与实现

摘要 图像分割作为计算机视觉领域的基础任务,在目标检测、医学影像分析、自动驾驶等众多应用中发挥着关键作用。本文基于K-Means聚类算法设计并实现了一个完整的图像分割系统,该系统集成了多种颜色空间转换、自定义初始化策略、空间特征融合等先进技术。通过Python和Tkinter…

Android Studio常用知识总结

一、运行方式1.运行 (Run)当您选择“运行”时&#xff0c;Android Studio 会编译您的应用并将其安装到目标设备或模拟器上。这通常用于&#xff1a;快速部署: 您只想看看应用是否能正常启动并运行&#xff0c;或者进行一些基础的用户界面测试。性能测试: 在正常运行模式下测试应…

设计模式笔记_行为型_访问者模式

1. 访问者模式介绍访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许你在不改变对象结构的前提下&#xff0c;定义作用于这些对象的新操作。访问者模式将操作的逻辑从对象结构中分离出来&#xff0c;使得你可以在运行时动态地添加新的…

数学建模 14 中心对数比变换

用途&#xff1a;是处理成分数据的核心预处理方法&#xff0c;核心目标是解决成分数据的和为常数100% &#xff0c; 导致的维度冗余&#xff0c;非线性相关问题。使得数据满足传统的统计/建模方法&#xff1b;举例子&#xff1a;食品比例中 面粉(50%),糖(30%),水(20%)原理&…

【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day7

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

污水处理行业的 “智能革命”:边缘计算网关如何重塑传统运维模式?

污水处理行业的 “智能革命”&#xff1a;边缘计算网关如何重塑传统运维模式&#xff1f;在污水处理这一关乎生态环境与可持续发展的关键领域&#xff0c;蓝蜂网关正凭借其先进技术与强大功能&#xff0c;发挥着无可替代的重要作用。作为工业级物联网解决方案的核心组件&#x…

ASP.NET Core 中的多租户 SaaS 应用程序

介绍随着软件即服务 (SaaS) 持续主导技术领域&#xff0c;构建能够高效地从单一代码库服务于多位客户&#xff08;租户&#xff09;的应用程序变得至关重要。ASP.NET Core 凭借其模块化和可扩展的架构&#xff0c;是实现多租户 SaaS 应用程序的强大框架。本文将指导您了解构建多…

JUC之CompletableFuture【中】

文章目录四、CompletableFuture基本使用4.1 默认线程池、无返回值4.2 默认线程池、有返回值4.3 自定义线程池、有返回值4.4 CompletableFuture 获取结果五、对结果进行处理5.1 方法说明5.2 示例5.3 thenApply vs thenApplyAsync5.3.1 核心区别: 执行线程不同5.3.2 thenApply: 同…