Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

本文主要是介绍Java 字符串操作之contains 和 substring 方法最佳实践与常见问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例...

一、contains 方法详解

1. 方法定义与语法

public boolean contains(CharSequence s)
  • 功能:检查字符串是否包含指定的字符序列
  • 参数CharSequence 类型(String 实现了该接口)
  • 返回值:boolean 类型(true 表示包含,false 表示不包含)

2. 底层实现原理

// String 类中的实际实现
public boolean contains(CharSequence s) {
    return indjavascriptexOf(s.toString()) >= 0;
}
  • 实际调用 indexOf() 方法
  • 如果找到子串返回索引位置(≥0),否则返回 -1
  • 时间复杂度:O(n*m),n 是原字符串长度,m 是子串长度

3. 使用示例

String text = "Java programming is fun";
System.out.println(text.contains("pro"));  // true
System.out.println(text.contains("python")); // false

4. 注意事项

  • 大小写敏感"Hello".contains("hello") 返回 false
  • 空字符串"abc".contains("javascript;") 总是返回 true
  • null 参数:会抛出 NullPointerException

二、substring 方法详解

1. 方法重载

public String substring(int beginIndex)
public String substring(int beginIndex, int endIndex)

2. 参数说明

参数说明注意事项
beginIndex起始索引(包含)必须 ≥0 且 ≤ 字符串长度
endIndex结束索引(不包含)必须 ≥ beginIndex 且 ≤ 字符串长度

3. 使用示例

String str = "HelloWorld";
// 从索引5开始到结尾
System.out.println(str.substring(5)); // "World"
// 从索引0开始到5(不包含5)
System.out.println(str.substring(0, 5)); // "Hello"

4. 常见错误

// 索引越界
str.substring(10); // StringIndexOutOfBoundsException
// 参数顺序错误
str.substring(5, 0); // StringIndexOutOfBoundsException

三、contains 和 substring 结合使用

1. 原代码分析

public static String findSubstringWithContext(String text, String subString) {
    if (text.contains(subString)) {
        int startIndex = text.indexOf(subString);
        int endIndex = startIndex + subString.length();
        return text.substring(0, endIndex);
    }
    return "子串未找到";
}

2. 问题诊断

  • 功能不完整:只返回了子串前面的内容,没有返回后面的内容
  • 描述不符:方法名暗示返回"完整前后内容",但实际只返回了前半部分
  • 输出格式:没有明确区分前后文和子串本身

3. 改进实现

public static String getSubstringContext(String text, String sub) {
    if (!text.contains(sub)) {
        return "未找到子串";
    }
    int start = text.indexOf(sub);
    int end = start + sub.length();
    String before = (start > 0) ? text.substring(0, start) : "";
    String after = (end < text.length()) ? text.substring(end) : "";
    return "前文: \"" + before + "\", 子串: \"" + sub + "\", 后文: \"" + after + "\"";
}

4. 测试用例

String text = "这是一个测试字符串,用于测试子串出现的完整前后内容。";
String subString = "测试";
System.out.println(getSubstringContext(text, subString));
// 输出: 前文: "这是一个", 子串: "测试", 后文: "字符串,用于测试子串出现的完整前后内容。"

四、其他重要字符串方法详解

1. split 方法

String csv = "张三,20,男";
String[] parts = csv.split(","); // ["python张三", "20", "男"]
  • 正则表达式支持split("\\.") 按点分割
  • 限制分割次数split(",", 2) 只分割成两部分

2. replace/replaceAll

String input = "a1b2c3";
String replaced = input.replaceAll("\\d", ""); // "abc"
  • reeYaBwZplace:替换字符或字符序列
  • replaceAll:使用正则表达式替换

3. trim 和 isEmpty

String userInput = "  Hello World  ";
String trimmed = userInput.trim(); // "Hello World"
boolean empty = trimmed.isEmpty(); // false
  • trim():移除首尾空白字符
  • isEmpty():检查长度是否为0

4. startsWith/endsWith

String filename = "document.txt";
boolean isTextFile = filename.endsWith(".txt"); // true

五、最佳实践与常见问题

1. 字符串操作最佳实践

  1. 空值检查:始终检查可能为 null 的字符串
  2. 索引边界:使用 substring 前验证索引范围
  3. 不可变性:字符串不可变,操作返回新对象
  4. 性能考虑:避免在循环中拼接字符串(使用 StringBuilder)

2. 常见问题解决方案

问题:contains 大小写敏感

// 解决方案:统一转换为小写
if (text.toLowerCase().contains(sub.toLowerCase())) { ... }

问题:substring 索引计算错误

// 正确计算结束索引
int endIndex = startIndex + subString.length();

问题:处理多字节字符(中文)

String chinese = "你好世界";
// substring 正确处理多字节字符
System.out.println(chinese.substring(0, 2)); // "你好"

3. 性能优化技巧

// 当需要多次检查包含关系时
int index = text.indexOf(sub);
if (index != -1) {
    // 直接使用index,避免二次查找
    String before = text.substring(0, index);
    // ...
}

六、完整示例代码

public class StringOperations {
    public static void main(String[] args) {
        String text = "Java编程很有趣,Java是最好的编程语言之一";
        String sub = "Java";
        String context = getSubstringContext(text, sub);
        System.out.println(context);
    }
    public static String getSubstringContext(String text, String sub) {
        if (text == null || sub == null) {
            return "输入不能为null";
        }
        if (!text.contains(sub)) {
            return "未找到子串: \"" + sub + "\"";
        }
        int start = text.indexOf(sub);
        int end = start + sub.length();
        String before = (start > 0) ? text.substring(0, start) : "[开头]";
        String after = (end < text.length()) ? text.substring(end) : "[结尾]";
        return String.format("前文: \"%s\", 子串: \"%s\", 后文: \"%s\"", before, sub, after);
    }
}

输出结果:

前文: "", 子串: "Java", 后文: "编程很有趣,Java是最好的编程语言之一"

总结

  1. contains 方法
    • 用于检查字符串是否包含子串
    • 底层基China编程于 indexOf 实现
    • 大小写敏感,需注意匹配规则
  2. substring 方法
    • 用于截取字符串的指定部分
    • 有两种重载形式
    • 必须正确处理索引边界
  3. 结合使用
    • 先用 contains 检查存在性
    • 再用 indexOf 获取位置
    • 最后用 substring 提取前后文
    • 注意处理边界情况(开头、结尾)
  4. 最佳实践
    • 添加空值检查
    • 明确区分前后文
    • 使用格式化输出提高可读性
    • 考虑多字节字符支持

通过深入理解 contains 和 substring 方法的工作原理及结合使用技巧,您可以更有效地处理字符串操作任务,编写出健壮、高效的代码。

到此这篇关于Java 字符串操作之contains 和 substring 方法最佳实践与常见问题的文章就介绍到这了,更多相关java contains 和 substring使用内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Java 字符串操作之contains 和 substring 方法最佳实践与常见问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155980

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三