0

0

Java中如何查找字符串中的字符_indexOf与charAt方法实战

P粉602998670

P粉602998670

发布时间:2026-03-11 09:35:44

|

109人浏览过

|

来源于php中文网

原创

indexof 找不到字符时返回 -1 而非抛异常;常见错误是直接将 indexof 结果传给 charat 导致索引越界;使用前须检查返回值 ≥ 0;重载方法包括查字符、子串及指定起始位置;区分大小写;charat 仅按索引取值,越界必抛 stringindexoutofboundsexception。

java中如何查找字符串中的字符_indexof与charat方法实战

indexOf 找不到字符时返回 -1,不是抛异常

很多人以为 indexOf 找不到会像 charAt 那样报 StringIndexOutOfBoundsException,其实不会——它安静地返回 -1。这个设计本意是方便判断“是否存在”,但恰恰因为不报错,容易埋下空指针或逻辑跳过的问题。

常见错误现象:用 indexOf 查找后直接传给 charAt,比如 str.charAt(str.indexOf('x')),当字符不存在时,就拿 -1 去索引,立刻崩。

  • 使用前务必检查返回值是否 ≥ 0:int pos = str.indexOf('a'); if (pos >= 0) { ... }
  • indexOf 有多个重载:查单个 charindexOf(int ch))、查子串(indexOf(String str))、从指定位置开始查(indexOf(char, fromIndex)),注意参数类型别传错
  • 区分大小写:"Abc".indexOf('a') 返回 -1,不是 0

charAt 越界只看长度,不关心内容是否存在

charAt 的职责非常单纯:按索引取字符。它不管你要的索引对应的是不是目标字符,也不管这个位置有没有意义——只要越界(index = length()),立刻抛 StringIndexOutOfBoundsException

典型误用场景:循环遍历字符串时用 for (int i = 0; i ,多跑一次导致 <code>i == str.length() 时调用 charAt 必崩。

立即学习Java免费学习笔记(深入)”;

星月写作
星月写作

专为网络小说、 剧本创作者打造的AI增效工具

下载
  • 合法索引范围是 0str.length() - 1,闭区间
  • 不要假设 indexOfcharAt 可以混用而不出错,它们的契约完全不同
  • 如果只是想确认某个位置的字符是不是目标值,直接用 str.charAt(i) == 'x' 更直观,比先 indexOfcharAt 少一层间接

性能差异:indexOf 是线性扫描,charAt 是 O(1) 随机访问

在字符串很长、查找频繁的场景下,两者的开销差别明显。charAt 底层就是数组索引,几乎无成本;而 indexOf 每次都要从头或指定位置往后逐个比对,最坏 O(n)。

比如要判断一个长日志字符串里是否包含某个关键字,用 indexOf != -1 是合理选择;但如果已经知道大概位置(比如第 1000 个字符附近),硬要写成 str.indexOf('x', 990),不如直接 str.charAt(995) == 'x' 来得快又稳。

  • 反复查同一字符串的多个固定位置?优先用 charAt
  • 不确定位置、需要定位首次出现点?用 indexOf,但记得加边界检查
  • Java 9+ 字符串内部用 byte[] 存储(紧凑字符串),对 ASCII 字符不影响 charAt 性能,但 indexOf 的比较逻辑仍需逐字节读取

中文和 emoji 场景下 charAt 可能“取半”

Java 的 char 是 UTF-16 编码单位,不是 Unicode 字符。遇到增补字符(如大多数 emoji、部分汉字),一个字符实际占两个 char(即一个代理对)。这时 charAt(i) 只能拿到高代理或低代理,单独看是无效值。

现象:对字符串 "?‍?"(程序员 emoji)调用 charAt(0) 得到 '\ud83d'charAt(1) 得到 '\udcfc',都不是完整字符;length() 返回 2,但真实字符数是 1。

  • 需要准确计数或遍历时,改用 str.codePointCount(0, str.length())str.charAt(i) + Character.isSurrogatePair 判断
  • 更稳妥的做法是用 str.codePoints().forEach(...) 流式处理 Unicode 字符
  • indexOf 在这种场景下行为一致:它也按 UTF-16 码元匹配,所以查 "?‍?".indexOf('\ud83d') 会命中,但这通常不是你想要的语义

事情说清了就结束。真正麻烦的从来不是方法怎么写,而是你以为它在干一件事,其实它在干另一件。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1228

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1184

2024.04.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号