Java——String
在 Java 中,String 类是用于表示不可变字符序列的核心类,提供了丰富的 API 用于操作字符串。以下是 String 类的关键特性和常用方法详解:
一、String 的核心特性
-
不可变性(Immutable)
- 一旦创建,字符串内容不可修改。所有修改操作(如拼接、替换)都会生成新字符串。
- 优势:线程安全、缓存哈希值、复用字符串常量池。
- 示例:
String s1 = "Hello"; String s2 = s1.concat(" World"); // s1 不变,s2 是新对象 "Hello World"
-
字符串常量池(String Pool)
- 直接使用双引号创建的字符串会被存入常量池,重复的字符串字面量会复用对象。
new String("...")会强制在堆中创建新对象,即使内容相同。- 示例:
String a = "Java"; // 常量池中的对象 String b = "Java"; // 复用常量池的对象(a == b 为 true) String c = new String("Java"); // 堆中新对象(a == c 为 false)
二、String 的构造方法
| 构造方法 | 描述 |
|---|---|
String() | 创建空字符串对象 |
String(String original) | 基于现有字符串创建新对象(内容相同,但对象不同) |
String(char[] value) | 通过字符数组创建字符串 |
String(byte[] bytes, Charset charset) | 通过字节数组和指定编码创建字符串 |
String(StringBuffer buffer) | 通过 StringBuffer 创建字符串 |
String(StringBuilder builder) | 通过 StringBuilder 创建字符串 |
示例:
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String s1 = new String(chars); // "Hello"byte[] bytes = {72, 101, 108, 108, 111};
String s2 = new String(bytes, StandardCharsets.UTF_8); // "Hello"
三、String 的常用 API
1. 字符串基本信息
| 方法 | 描述 | 示例 |
|---|---|---|
int length() | 返回字符串长度 | "Java".length() → 4 |
boolean isEmpty() | 判断字符串是否为空(长度为0) | "".isEmpty() → true |
boolean isBlank() | 判断字符串是否全为空白(Java 11+) | " ".isBlank() → true |
2. 字符串操作
| 方法 | 描述 | 示例 |
|---|---|---|
String concat(String str) | 拼接字符串,返回新字符串 | "Hello".concat("!") → “Hello!” |
String substring(int beginIndex) | 截取从 beginIndex 到末尾的子串 | "Java".substring(1) → “ava” |
String substring(int begin, int end) | 截取 [begin, end) 的子串 | "Java".substring(1, 3) → “av” |
String replace(char old, char new) | 替换所有匹配字符 | "Java".replace('a', 'o') → “Jovo” |
String replaceAll(String regex, String replacement) | 使用正则替换所有匹配的子串 | "a1b2".replaceAll("\\d", "-") → “a-b-” |
String[] split(String regex) | 按正则分割字符串为数组 | "a,b,c".split(",") → [“a”, “b”, “c”] |
String toLowerCase() | 转为小写 | "JAVA".toLowerCase() → “java” |
String toUpperCase() | 转为大写 | "java".toUpperCase() → “JAVA” |
String trim() | 去除首尾空白符(ASCII空格、制表符等) | " Java ".trim() → “Java” |
String strip() | 去除首尾空白符(支持全角空格,Java 11+) | " Java ".strip() → “Java” |
3. 字符串比较
| 方法 | 描述 | 示例 |
|---|---|---|
boolean equals(Object obj) | 比较内容是否相等(区分大小写) | "Java".equals("java") → false |
boolean equalsIgnoreCase(String str) | 比较内容是否相等(不区分大小写) | "Java".equalsIgnoreCase("JAVA") → true |
int compareTo(String str) | 按字典序比较大小(返回负数、0、正数) | "a".compareTo("b") → -1 |
int compareToIgnoreCase(String str) | 按字典序比较大小(忽略大小写) | "A".compareToIgnoreCase("a") → 0 |
4. 字符串查找
| 方法 | 描述 | 示例 |
|---|---|---|
boolean contains(CharSequence s) | 是否包含指定子串 | "Java".contains("av") → true |
int indexOf(int ch) | 返回字符首次出现的索引(未找到返回-1) | "Java".indexOf('a') → 1 |
int indexOf(String str) | 返回子串首次出现的索引 | "Java".indexOf("va") → 2 |
int lastIndexOf(int ch) | 返回字符最后一次出现的索引 | "Java".lastIndexOf('a') → 3 |
boolean startsWith(String prefix) | 是否以指定前缀开头 | "Java".startsWith("Ja") → true |
boolean endsWith(String suffix) | 是否以指定后缀结尾 | "Java".endsWith("va") → false |
5. 类型转换
| 方法 | 描述 | 示例 |
|---|---|---|
char[] toCharArray() | 转为字符数组 | "Java".toCharArray() → [‘J’,‘a’,‘v’,‘a’] |
byte[] getBytes() | 转为默认编码的字节数组 | "Java".getBytes() → [74, 97, 118, 97] |
byte[] getBytes(Charset charset) | 转为指定编码的字节数组 | "Java".getBytes(StandardCharsets.UTF_8) |
static String valueOf(Object obj) | 将对象转为字符串(调用 obj.toString()) | String.valueOf(123) → “123” |
四、注意事项
-
字符串比较必须用
equals,而非==String s1 = new String("Java"); String s2 = new String("Java"); System.out.println(s1 == s2); // false(比较对象地址) System.out.println(s1.equals(s2)); // true(比较内容) -
避免频繁拼接字符串
使用+或concat拼接字符串会生成大量中间对象,应改用StringBuilder:StringBuilder sb = new StringBuilder(); sb.append("Hello").append(" ").append("World"); String result = sb.toString(); // "Hello World" -
处理空指针(Null Safety)
在调用字符串方法前检查是否为null:String str = null; if (str != null && !str.isEmpty()) {// 安全操作 }
五、示例代码
public class StringDemo {public static void main(String[] args) {String s = " Hello, Java! ";// 基本操作System.out.println(s.trim()); // "Hello, Java!"System.out.println(s.substring(7)); // "Java! "System.out.println(s.replace("Java", "World")); // " Hello, World! "// 比较System.out.println("java".equalsIgnoreCase("JAVA")); // true// 分割与拼接String[] parts = "a,b,c".split(",");String joined = String.join("-", parts); // "a-b-c"System.out.println(joined);}
}
六、Java 11+ 新增方法
| 方法 | 描述 | 示例 |
|---|---|---|
String repeat(int n) | 重复字符串 n 次 | "a".repeat(3) → “aaa” |
String stripLeading() | 去除头部空白符(支持全角空格) | " Java".stripLeading() → “Java” |
String stripTrailing() | 去除尾部空白符(支持全角空格) | "Java ".stripTrailing() → “Java” |
boolean isBlank() | 判断是否全为空白符(包括全角空格) | " ".isBlank() → true |
掌握这些 API 能高效处理字符串操作,注意合理选择方法以优化性能!
相关文章:
Java——String
在 Java 中,String 类是用于表示不可变字符序列的核心类,提供了丰富的 API 用于操作字符串。以下是 String 类的关键特性和常用方法详解: 一、String 的核心特性 不可变性(Immutable) 一旦创建,字符串内容不…...
Channel State Information 信道状态信息
Channel State Information(CSI,信道状态信息)是无线通信系统中的一个重要概念,指的是接收端或发送端对无线信道特性的估计和反馈。CSI可以用于优化无线通信性能,例如信道均衡、预编码、波束成形等,以提高数…...
python中单例模式应用
数据库连接池单例模式 1. 为什么使用单例模式 创建数据库连接是一个昂贵的过程(涉及网络通信、认证等)。单例模式的连接池可以在程序启动时初始化一组连接,并在整个生命周期中重用这些连接,而不是每次请求都新建连接。同时还可…...
StarRocks 在爱奇艺大数据场景的实践
作者:林豪,爱奇艺大数据 OLAP 服务负责人 小编导读: 本文整理自爱奇艺工程师在 StarRocks 年度峰会的分享,介绍了爱奇艺 OLAP 引擎演化及引入 StarRocks 后的效果。 在广告业务中,StarRocks 替换 ImpalaKudu 后&#x…...
Easy Trans Spring Boot Starter ---Spring系列的字段翻译库
Easy Trans Spring Boot Starter 使用文档 1. 简介 easy-trans-spring-boot-starter 是一个基于 Spring Boot 的库,用于简化数据翻译和转换操作。它可以帮助你将数据库中的枚举值、状态码等转换为用户友好的文本,或者将一种数据格式转换为另一种格式。…...
JAVA入门——IO流
一、了解File类 这个类里面提供了一些文件相关的方法,了解即可,方法有很多,不好背下面这个是最常用的只能对文件本身操作,不能读取数据 public File[] listFiles();//获取当前路径下的所有内容 注意:如果是需要权限才…...
Spring Boot 流式响应豆包大模型对话能力
当Spring Boot遇见豆包大模型:一场流式响应的"魔法吟唱"仪式 一、前言:关于流式响应的奇妙比喻 想象一下你正在火锅店点单,如果服务员必须等所有菜品都备齐才一次性端上来,你可能会饿得把菜单都啃了。而流式响应就像贴…...
Android Binder 用法详解
Binder 是 Android 系统中的一种进程间通信(IPC)机制,它允许不同进程之间进行高效通信。Binder 在 Android 系统中被广泛使用,例如在 Activity 与 Service 的交互中。 Binder 的基本组成 实现 Binder 通信通常包含以下几个关键部…...
在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思?
在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思? 在 Ubuntu(或其他基于 GNOME 文件管理器的 Linux 发行版)中,文件或文件夹的右下角出现一把“锁”标志,通常表示 你当前的用户没有该文件/文件夹的写…...
达梦数据库如何收集表和索引的统计信息
命令: DBMS_STATS.GATHER_TABLE_STATS(OWNNAME >HIDC,TABNAME > SYS_OSS,ESTIMATE_PERCENT>100,METHOD_OPT > FOR ALL COLUMNS SIZE AUTO,DEGREE > 2,CASCADE > true); dbms_stats.gather_table_stats:用于收集目标表,目…...
大语言模型:从诞生到未来的探索
1 发展历程 1.1 早期探索:基础积累 大语言模型的发展并非一蹴而就,其源头可以追溯到自然语言处理的早期阶段。早期的自然语言处理系统主要基于规则和模板,通过人工编写的语法规则来处理文本。例如,早期的机器翻译系统就是根据预…...
DeepSeek-V3:AI语言模型的高效训练与推理之路
参考:【论文学习】DeepSeek-V3 全文翻译 在人工智能领域,语言模型的发展日新月异。从早期的简单模型到如今拥有数千亿参数的巨无霸模型,技术的进步令人瞩目。然而,随着模型规模的不断扩大,训练成本和推理效率成为了摆在…...
【多模态】Magma多模态AI Agent
1. 前言 微软杨建伟团队,最近在AI Agent方面动作连连,前两天开源了OmniParser V2,2月26日又开源了Magma,OmniParser专注在对GUI的识别解析,而Magma则是基于多模态技术,能够同时应对GUI和物理世界的交互&…...
DeepSeek掘金——DeepSeek R1驱动的PDF机器人
DeepSeek掘金——DeepSeek R1驱动的PDF机器人 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人。逐步学习如何增强AI检索能力,并创建一个能够高效处理和响应文档查询的智能聊天机器人。 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人…...
DeepSeek在PiscTrace上完成个性化处理需求案例——光流法将烟雾动态可视化
引言:PiscTrace作为开放式的视图分析平台提供了固定格式的类型参数支持个性化定制处理需求,本文一步步的实现光流分析按照不同需求根据DeepSeek的代码处理视频生成数据。 光流法(Optical Flow)是一种基于图像序列的计算机视觉技术…...
explore与explode词源故事
英语单词explore来自古法语,源自拉丁语,由前缀ex-(出来)加词根plor-(叫喊)以及末尾的小尾巴-e组成,字面意思就是“喊出来,通过叫喊声赶出来”。它为什么能表示“探索”呢?…...
LeeCode题库第三十七题
37.解数独 项目场景: 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请…...
【数字信号处理:从原理到应用的深度剖析】
一、数字信号处理的原理 数字信号处理(DSP)是一种通过数学算法对信号进行分析、处理和转换的技术。其核心在于对离散时间信号的操作,目的是提取有用信息或将信号转换为更易于解释的形式。 (一)信号的数字化过程 1. …...
MySQL 数据库安全配置最佳实践
文章目录 MySQL 数据库安全配置最佳实践账户与权限管理账户最小化原则权限最小化配置密码策略强化 认证与访问控制禁用匿名账户启用安全认证 网络安全防护访问源限制禁用远程root访问启用SSL加密 日志审计与监控全量审计配置二进制日志管理 服务端安全加固关键参数配置文件权限…...
小红书自动评论
现在越来越多的人做起来小红书,为了保证自己的粉丝和数据好看,需要定期养号。 那么养号除了发视频外,还需要积极在社区互动,比如点赞、评论等等,为了节省时间,我做了一个自动化评论工具。 先看效果 那这个是…...
OpenCV图像认知(一)
OpenCV: 是由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多算法 OpenCV-Python: OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。 Python是一种由Gui…...
自学微信小程序的第六天
DAY6 1、使用录音API首先需要通过wx.getRecorderManager()方法获取到一个RecorderManager实例,该实例是一个全局唯一的录音管理器,用于实现录音功能。 表32:RecorderManager实例的常用方法 方法名称 说明 start() 开始录音 pause() 暂停录音 resume() 继续录音 stop() 停止…...
C++动态与静态转换区别详解
文章目录 前言一、 类型检查的时机二、安全性三、适用场景四、代码示例对比总结 前言 在 C 中,dynamic_cast 和 static_cast 是两种不同的类型转换操作符,主要区别体现在类型检查的时机、安全性和适用场景上。以下是它们的核心区别: 一、 类…...
Qt6.8编译项目找不到文件——6.8.2\msvc2022_64\include\QtWidgets\QMainWindow does not exist.
问题:Error: dependent ‘…\Qt6.8.2\6.8.2\msvc2022_64\include\QtWidgets\QMainWindow’ does not exist. jom: D:\Temp\untitled1\build\Makefile [release] Error 2 20:20:43: 进程"D:\ProgramFiles\Develop\Qt6.8.2\Tools\QtCreator\bin\jom\jom.exe"…...
AI工具导航平台功能模块之混合分类器功能说明文档
AI工具导航平台功能模块之混合分类器功能说明文档 这是我最近正在开发的AI工具信息平台的部门功能模块混合分类器的说明文档,我的AI工具信息平台基于streamlit架构,整理出来与大家分享。 该程序的混合分类器采用规则引擎与深度学习模型协同工作的架构&…...
【时序预测】在线学习:算法选择(从线性模型到深度学习解析)
——如何为动态时序预测匹配最佳增量学习策略? 引言:在线学习的核心价值与挑战 在动态时序预测场景中(如实时交通预测、能源消耗监控),数据以流式(Streaming)形式持续生成,且潜在的…...
某个设备的RJ45网口接头为何不可连接任何POE设备
某个设备的RJ45网口接头不可连接任何POE设备 1.POE设备是什么? POE设备是指支持通过以太网线传输电力和数据的设备,即“Power over Ethernet”(PoE)技术的设备。这种技术允许网络设备在传输数据的同时,通过标准的RJ4…...
发展中的脑机接口:SSVEP特征提取技术
一、简介 脑机接口(BCI)是先进的系统,能够通过分析大脑信号与外部设备之间建立通信,帮助有障碍的人与环境互动。BCI通过分析大脑信号,提供了一种非侵入式、高效的方式,让人们与外部设备进行交流。BCI技术越…...
绕过密码卸载360终端安全管理系统
一不小心在电脑上安装了360终端安全管理系统,就会发现没有密码,就无法退出无法卸载360,很容易成为一个心病,360终端安全管理系统,没有密码,进程无法退出,软件无法卸载,前不久听同事说…...
Java数据结构第十五期:走进二叉树的奇妙世界(四)
专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、二叉树OJ练习题(续) 1.1. 二叉树的层序遍历 1.2. 二叉树的最近公共祖先 1.3. 从前序与中序遍历序列构造二叉树 1.4. 从中序与后序遍历序列构造二叉树 1.5. 根据二叉树创建…...
