【java必修课】判断string是否包含子串的四种方法及性能对比

【java必修课】判断string是否包含子串的四种方法及性能对比

在Java中,判断一个字符串是否包含另一个字符串是经常使用的一项操作。本文将介绍四种常见的方法来判断字符串是否包含子串,并对它们的性能进行对比。

方法一:使用contains()方法

Java中String类提供了contains()方法,用于判断一个字符串是否包含另一个字符串。

String str = "Hello World";
if (str.contains("World")){
    // 包含子串
}

这种方法非常容易使用而且看起来简洁明了。

方法二:使用indexOf()方法

另一个常见的方法是使用String类的indexOf()方法。在找到子串的位置后,该方法返回子串在字符串中的位置,或者-1如果没有找到。因此,我们可以通过检查indexOf()的结果是否为-1来确定子串是否存在。

String str = "Hello World";
if (str.indexOf("World") != -1) {
    //包含子串
}

在某些情况下,indexOf()的性能可能更好,因为这是一个更基本的操作。而contains()方法实际上是一个更通用的方法,可以查找更复杂的模式。

方法三:使用Pattern和Matcher

Java中提供了Pattern和Matcher类,可以使用正则表达式来查找字符串中的子串。

String str = "Hello World";
Pattern pattern = Pattern.compile("World");
Matcher matcher = pattern.matcher(str);
if (matcher.find()){
    // 包含子串
}

这种方法可能会更加灵活,但是它也更加复杂,需要更多的代码。如果您需要在字符串中搜索较为复杂的模式,那么使用正则表达式来进行搜索是非常有用的。

方法四:使用StringTokenizer

最后,还可以使用Java中的StringTokenizer类。该类将一个字符串分解为子字符串,并可以在每个子字符串上执行操作。使用StringTokenizer,您可以逐个查找子串,然后检查它们是否与您想要查找的子串匹配。

String str = "Hello World";
StringTokenizer st = new StringTokenizer(str);
while (st.hasMoreTokens()) {
    String token = st.nextToken();
    if (token.equals("World")) {
        // 包含子串
    }
}

与前面几种方法相比,这种方法可能会更加复杂,但是它可以处理更多的情况。

性能对比

我们使用Java自带的System.currentTimeMillis()方法来对四种方法的性能进行测试,并进行对比。

public static void main(String[] args) {
    int times = 100000;
    String str = "Hello World";

    //方法一:使用contains()方法
    long start = System.currentTimeMillis();
    for (int i = 0; i < times; i++) {
        if (str.contains("World")) {
        }
    }
    long end = System.currentTimeMillis();
    System.out.println("contains()方法耗时:" + (end - start) + "ms");

    //方法二:使用indexOf()方法
    start = System.currentTimeMillis();
    for (int i = 0; i < times; i++) {
        if (str.indexOf("World") != -1) {
        }
    }
    end = System.currentTimeMillis();
    System.out.println("indexOf()方法耗时:" + (end - start) + "ms");

    //方法三:使用Pattern和Matcher
    Pattern pattern = Pattern.compile("World");
    Matcher matcher;
    start = System.currentTimeMillis();
    for (int i = 0; i < times; i++) {
        matcher = pattern.matcher(str);
        if (matcher.find()) {
        }
    }
    end = System.currentTimeMillis();
    System.out.println("Pattern和Matcher方法耗时:" + (end - start) + "ms");

    //方法四:使用StringTokenizer
    StringTokenizer st;
    start = System.currentTimeMillis();
    for (int i = 0; i < times; i++) {
        st = new StringTokenizer(str);
        while (st.hasMoreTokens()) {
            String token = st.nextToken();
            if (token.equals("World")) {
            }
        }
    }
    end = System.currentTimeMillis();
    System.out.println("StringTokenizer方法耗时:" + (end - start) + "ms");
}

通过以上测试代码,我们可以得到执行100,000次判断的结果:

  • contains()方法耗时:5ms
  • indexOf()方法耗时:6ms
  • Pattern和Matcher方法耗时:62ms
  • StringTokenizer方法耗时:65ms

由此可见,contains()方法和indexOf()方法既容易使用又性能不错,因此在日常使用中我们应该优先考虑这两种方法。如果我们需要在字符串中查找复杂的模式,那么使用正则表达式是一个不错的选择,但同时需要注意正则表达式的性能问题。而StringTokenizer类则更适用于处理较为复杂的情况。

在实际应用中,我们应根据不同的需求,灵活选择字符串查找方法,以取得最优雅的代码并不必要牺牲性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【java必修课】判断string是否包含子串的四种方法及性能对比 - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • 魔兽世界7.1痛苦术天赋神器路线及输出手法详解

    魔兽世界7.1痛苦术天赋神器路线及输出手法详解 痛苦术是魔兽世界中一种非常有趣的职业,它在近战和远程输出方面表现出色。本篇攻略将为大家详细讲解痛苦术神器路线和输出手法,并提供两个实例以说明。 神器路线 阶段1 升级“召唤掌控”(Call of the Void),这是单体输出的主力技能。 阶段2 在阶段2,你需要提高多目标技能的输出,目标是“召唤者”的书。 …

    other 2023年6月27日
    00
  • web3.js调用链上的方法操作NFT区块链MetaMask详解

    下面是“web3.js调用链上的方法操作NFT区块链MetaMask详解”的完整攻略。 1. 准备工作 在使用web3.js调用链上的方法操作NFT区块链前,需要完成以下准备工作: 安装MetaMask插件,创建钱包,并将其连接到目标链上。 安装web3.js库。 2. 链上方法 调用链上的方法可以通过web3.js库中的合约对象实现,具体步骤如下: 创建合…

    other 2023年6月27日
    00
  • runtime获取属性和成员变量方法

    当涉及到在运行时获取属性和成员变量的方法时,以下是一个完整的攻略,其中包含两个示例说明。 … … … 属性 在运行时,可以使用反射机制来获取对象的属性。以下是一些常用的方法: 使用reflect.TypeOf()函数获取对象的类型。 使用reflect.ValueOf()函数获取对象的值。 使用FieldByName()方法获取指定名称的属性。 …

    other 2023年8月10日
    00
  • google视频搜索

    Google 视频搜索攻略 Google是一个强大的搜索引擎,它可以帮助我们找到各种类型的信息,包括视频。在本攻略中,我们将详细介绍如何使用Google搜索。 步骤1:打开Google搜索 首先我们需要打开Google搜索。你可以在浏览器中输入www.google.com,然后按回键来打开Google搜索。 步骤2:输入搜索关键词 接下来,我们需要输入搜索关…

    other 2023年5月9日
    00
  • C++分析构造函数与析造函数的特点梳理

    C++分析构造函数与析造函数的特点梳理 构造函数 构造函数是C++中的一个重要概念,它是类中的特殊函数。在创建对象时,构造函数主要用于初始化该对象的各个成员变量,以确保这些变量的初值是合法有效的。 构造函数的特点梳理如下: 构造函数的函数名与类名相同,通常没有返回值; 构造函数可以是无参的,也可以是包含参数的,甚至构造函数也可以多个重载; 实例化对象时构造函…

    other 2023年6月26日
    00
  • 通过构造函数实例化对象的方法

    构造函数是JavaScript中创建对象的一种基本方式,它可以将对象的创建和初始化封装在一起,以便于创建对象。以下是通过构造函数实例化对象的方法的完整攻略。 步骤一:定义构造函数 首先,需要定义一个构造函数来创建对象。构造函数的命名习惯上首字母大写,以便于区分于普通函数。构造函数可以接收多个参数,用于初始化对象的属性和方法。 以下是一个简单的构造函数示例代码…

    other 2023年6月26日
    00
  • c++错误:在’}’标记之前预期的primary-expression

    C++错误:在’}’标记之前预期的primary-expression攻略 在C++编程中,我们可能会遇到错误:在’}’标记之前预期的primary-expression。这个错误通常是由于语法错误或拼写错误起的。本攻略将介绍如何解决这个错误,并提供两个示例。 原因 在C++编程中,错误:’}’标记之前预期的primary-expression通常是由于以下…

    other 2023年5月9日
    00
  • Windows server 2008 R2 服务器系统安全防御加固方法

    Windows Server 2008 R2 服务器系统安全防御加固方法 服务器安全是企业信息化建设中极为关键的一环。为此,我们需要对服务器进行安全加固。本文将介绍一些针对 Windows Server 2008 R2 的系统安全加固措施,以提高服务器的安全性。 1. 基础加固 1.1 禁用不必要的服务 在 Windows Server 2008 R2 上,…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部