Java String contains() 方法(实战指南)

Java String contains() 方法详解:轻松判断字符串是否包含指定子串

在日常开发中,我们经常需要判断一个字符串里是否包含某个特定的子串。比如验证用户输入的邮箱是否包含“@”符号,或者检查一段文本是否含有敏感词。这时候,Java 提供的 String contains() 方法就派上用场了。它是一个简单却非常实用的工具,尤其适合初学者快速掌握字符串处理的基本操作。

Java String contains() 方法 用于判断一个字符串是否包含指定的子字符串(即子串)。它返回一个布尔值:如果包含,返回 true;否则返回 false。这个方法在文本处理、表单校验、日志分析等场景中极为常见。


方法语法与基本用法

contains() 方法是 String 类的实例方法,定义如下:

public boolean contains(CharSequence s)

其中,CharSequence 是一个接口,String 实现了这个接口,因此你可以传入字符串对象作为参数。

示例 1:基础使用

public class ContainsDemo {
    public static void main(String[] args) {
        String text = "欢迎学习 Java 编程语言";
        
        // 判断是否包含“Java”这个子串
        boolean result = text.contains("Java");
        
        // 输出结果
        System.out.println("字符串中是否包含 'Java':" + result); // 输出:true
    }
}

中文注释说明

  • text.contains("Java") 是核心调用,检查 text 字符串中是否包含“Java”这一子串。
  • 由于原字符串确实包含“Java”,所以返回 true
  • System.out.println 用于输出判断结果,方便调试和查看。

区分大小写:注意字母的大小写敏感性

Java String contains() 方法大小写敏感的。这意味着 "Java""java" 被视为两个不同的字符串。

示例 2:大小写敏感性演示

public class CaseSensitiveCheck {
    public static void main(String[] args) {
        String greeting = "Hello World";
        
        // 尝试查找小写的 "hello"
        boolean containsHello = greeting.contains("hello");
        System.out.println("是否包含 'hello':" + containsHello); // 输出:false
        
        // 正确查找大写的 "Hello"
        boolean containsHelloCorrect = greeting.contains("Hello");
        System.out.println("是否包含 'Hello':" + containsHelloCorrect); // 输出:true
    }
}

中文注释说明

  • greeting.contains("hello") 返回 false,因为原字符串是“Hello”(首字母大写)。
  • 这说明 contains() 不会自动忽略大小写,必须精确匹配。
  • 如果你需要不区分大小写的查找,可以先将字符串转为统一大小写再判断。

实际应用场景:用户输入校验

在实际项目中,contains() 常用于表单数据校验。例如,验证用户注册时输入的邮箱是否包含“@”和“.”符号。

示例 3:邮箱格式初步校验

public class EmailValidation {
    public static void main(String[] args) {
        String email = "user@example.com";
        
        // 检查是否包含 '@' 和 '.'
        boolean hasAt = email.contains("@");
        boolean hasDot = email.contains(".");
        
        if (hasAt && hasDot) {
            System.out.println("邮箱格式初步校验通过!");
        } else {
            System.out.println("邮箱格式不正确,请检查是否包含 '@' 和 '.'");
        }
    }
}

中文注释说明

  • email.contains("@") 检查邮箱中是否有“@”符号,这是邮箱的基本特征。
  • email.contains(".") 检查是否有“.”,用于分隔域名部分。
  • 使用 && 连接两个条件,只有同时满足才认为初步校验通过。
  • 注意:这只是基础校验,更完整的邮箱验证建议使用正则表达式。

处理空值与边界情况

在实际编码中,我们常常需要处理可能为 null 的字符串。如果对 null 调用 contains(),会抛出 NullPointerException

示例 4:安全使用 contains() 的方式

public class SafeContainsCheck {
    public static void main(String[] args) {
        String input = null;
        
        // ❌ 错误做法:直接调用会导致空指针异常
        // boolean result = input.contains("test"); // 抛出 NullPointerException
        
        // ✅ 正确做法:先判断是否为 null
        if (input != null && input.contains("test")) {
            System.out.println("包含 'test' 字符串");
        } else {
            System.out.println("输入为空或不包含 'test'");
        }
    }
}

中文注释说明

  • input != null 是前置判断,防止对 null 调用方法。
  • 使用短路逻辑 &&,如果 inputnull,后面的 contains() 不会被执行。
  • 这是 Java 编程中非常重要的防御性编程习惯。

性能与底层原理简析

contains() 方法的底层实现是基于 indexOf() 方法。它会从字符串的起始位置开始,逐个字符比对,直到找到匹配的子串或遍历完所有字符。

内部逻辑(简化版):

public boolean contains(CharSequence s) {
    return indexOf(s.toString()) >= 0;
}

这意味着:

  • 如果子串不存在,方法会遍历整个字符串,时间复杂度为 O(n × m),其中 n 是原字符串长度,m 是子串长度。
  • 对于短字符串,性能影响可忽略;但处理超长文本时,建议使用更高效的算法(如 KMP)或正则表达式。

与 indexOf() 的对比:你该用哪个?

虽然 contains()indexOf() 都能判断子串是否存在,但它们的使用场景略有不同。

方法 返回类型 是否返回位置 适用场景
contains() boolean 仅需判断是否存在
indexOf() int 是(位置索引) 需要获取子串位置

示例 5:对比使用场景

public class CompareContainsAndIndex {
    public static void main(String[] args) {
        String sentence = "今天是个好日子,阳光明媚";

        // 使用 contains():只需判断是否包含
        if (sentence.contains("好日子")) {
            System.out.println("找到了关键词 '好日子'!");
        }

        // 使用 indexOf():不仅判断,还获取位置
        int index = sentence.indexOf("好日子");
        if (index != -1) {
            System.out.println("在位置 " + index + " 找到 '好日子'");
        }
    }
}

中文注释说明

  • sentence.contains("好日子") 只关心是否存在,代码简洁。
  • sentence.indexOf("好日子") 返回索引,可用于后续操作,如截取子串。
  • 如果你只需要布尔判断,优先使用 contains(),代码更直观。

常见误区与最佳实践

  1. 不要忽略空字符串
    "".contains("") 返回 true,即空字符串包含自己。这在逻辑判断时需注意。

  2. 不要依赖 contains() 做复杂匹配
    它无法处理通配符或正则模式。例如 contains("a*") 不会匹配星号通配符。

  3. 避免在循环中频繁调用
    如果要检查多个关键词,建议将关键词放入集合,统一处理,提升效率。

  4. 结合 trim() 使用
    用户输入可能带空格,建议先去空格再判断:

String input = "  Java  ";
if (input.trim().contains("Java")) {
    System.out.println("匹配成功");
}

总结:掌握 Java String contains() 方法的核心要点

Java String contains() 方法 是字符串处理中不可或缺的工具。它简单、直观、高效,特别适合初学者快速上手。通过本文的学习,你应该已经掌握了:

  • 方法的基本语法和返回值
  • 大小写敏感的特性
  • 实际应用如输入校验
  • 空值安全处理
  • indexOf() 的区别
  • 常见误区和最佳实践

在后续开发中,遇到“是否包含某个词”的需求时,别忘了先想想 contains()。它就像一把钥匙,能帮你快速打开字符串判断的大门。记住:写代码不是追求复杂,而是追求清晰和可靠。而 contains(),正是这种简洁智慧的体现。