Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 源码 关于 字符串的包含 原来就是强行的匹配

Java 源码 关于 字符串的包含 原来就是强行的匹配

作者头像
韩旭051
发布于 2021-10-13 06:27:07
发布于 2021-10-13 06:27:07
40000
代码可运行
举报
文章被收录于专栏:刷题笔记刷题笔记
运行总次数:0
代码可运行

闲的没事 就是想看一下 Java 用的啥算法 查找 字符串匹配

String 的 contains 方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 String s = new String("aaa");
        s.contains("a");

追到 String 源码 就是用的 indexOf 这个 方法

上源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    static int indexOf(char[] source, int sourceOffset, int sourceCount,
            String target, int fromIndex) {
        return indexOf(source, sourceOffset, sourceCount,
                       target.value, 0, target.value.length,
                       fromIndex);
    }

转成 character 数组 进行 搜索🔍 可以 学到 target.value 用 String 转 数组

/** * Code shared by String and StringBuffer to do searches. The * source is the character array being searched, and the target * is the string being searched for. * * @param source the characters being searched. * @param sourceOffset offset of the source string. * @param sourceCount count of the source string. * @param target the characters being searched for. * @param targetOffset offset of the target string. * @param targetCount count of the target string. * @param fromIndex the index to begin searching from. */

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  static int indexOf(char[] source, int sourceOffset, int sourceCount,
            char[] target, int targetOffset, int targetCount,
            int fromIndex) {
        if (fromIndex >= sourceCount) {
            return (targetCount == 0 ? sourceCount : -1);
        }// 是不是 下标 和 长度 超了 直接返回
        if (fromIndex < 0) {
            fromIndex = 0;
        }// 从0以上开始才行
        if (targetCount == 0) {// 到头了就别 匹配了
            return fromIndex;
        }

        char first = target[targetOffset];// 开始匹配
        int max = sourceOffset + (sourceCount - targetCount);// 匹配终点

        for (int i = sourceOffset + fromIndex; i <= max; i++) {
            /* Look for first character. */
            if (source[i] != first) {// 先匹配到 头节点
                while (++i <= max && source[i] != first);// 注意⚠️ for 循环♻️内部的 i跟着一起 变呢
            }

            /* Found first character, now look at the rest of v2 */
            if (i <= max) {
                int j = i + 1;// 第二个字符
                int end = j + targetCount - 1;// 最后的 范围
                for (int k = targetOffset + 1; j < end && source[j]
                        == target[k]; j++, k++);// 一个一个匹配 同时 更新 j++ 

                if (j == end) {  // ✅匹配成功 就返回
                    /* Found whole string. */
                    return i - sourceOffset;
                }
            }
        }
        return -1;// 🙅‍♂️ 到最后也没成功 ❌
    }

我以为多神奇的 匹配 原来就是 一个一个的匹配 哈哈 唯一的 优化 就是 先匹配第一个 字符 第一个字符 对上了后面就 循环遍历

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
字符串匹配算法从indexOf函数讲起
相信每个学习过Java的人都使用过indexOf函数,indexOf函数我们可以查找一个字符串(模式串)是否在另一个字符串(主串)出现过,返回结果表示出现位置的下标,如果返回-1,表示模式串在主串中不存在,那么,你可曾想过这些查找函数又是如何实现的呢?
黄林晴
2020/01/13
1.4K0
字符串匹配算法从indexOf函数讲起
KMP和String.indexOf
JDK源码中的String.indexOf是蛮力匹配的,可是JDK库的indexOf要比KMP快?算法不是让计算效率更高吗?JDK源码如下:
只喝牛奶的杀手
2019/08/26
2K0
Java源码学习 -- java.lang.String
java.lang.String是使用频率非常高的类。要想更好的使用java.lang.String类,了解其源代码实现是非常有必要的。由java.lang.String,自然联想到java.lang
YGingko
2017/12/28
5350
String-源码阅读
上文:jdk-8大基础类型源码阅读(byte、short、int、long、float、double、boolean、char)
逍遥壮士
2022/12/01
2860
Java API:String class 原
上面由API提供的描述,可以看出,String是一个最终类,继承了Object类,实现了序列化接口和排序接口以及char可读序列接口。可以得出以下几个特点。
云飞扬
2019/03/12
1.2K0
JAVA类String
今天要讲的是JDK中的String类了,相信大家对这个类特别的熟悉,那今天话不多说,直接讲一些常用的方法。
用户6055494
2019/12/15
5820
【刨根问底】String源码解析
String的内容是不可变的,并且String的底层就是使用char数组来存储的。
田维常
2019/07/16
6780
【刨根问底】String源码解析
一文看完String的前世今生,内容有点多,请耐心看完!
String字符串作为一种引用类型,在Java中的地位举足轻重,也是代码中出现频率最高的一种数据结构,因此,我们需要像分析Object一样,将String作为一个topic,单独拿出来总结,这里面涉及到字符串的不可变性,字符串拼接、存储、比较、截取以及StringBuffer,StringBuilder区别等。
JavaBuild
2024/05/27
1230
一文看完String的前世今生,内容有点多,请耐心看完!
java 文本关键字查找功能原理和代码
在使用String中indexOf()方法的时候,我们知道如果要是传入一个子字符串作为参数的话类似”from”,则这个方法就返回此”from”子字符串第一次在此字符串中出现的位置,即返回此字符串中第一个”from”子字符串中字符”f”的位置。
全栈程序员站长
2022/08/09
1.1K0
字符串模式匹配趣味算法
文本是我们接触最多的一种数据格式了。随着互联网生产的UGC(user gernerate content)越来越多,对文本的处理需求也越来越多。 闲话少说,我们来看下字符串的文本匹配都有哪些有趣的算法。
玄姐谈AGI
2019/11/06
1K0
字符串模式匹配趣味算法
Java String类源码阅读笔记
本文基于jdk1.8 String类可谓是我们开发中使用最多的一个类了。对于它的了解,仅仅限于API的了解是不够的,必须对它的源码进行一定的学习。
三分恶
2020/09/22
4870
Java String类源码阅读笔记
JVM之符号引用和直接引用
直接引用和虚拟机的布局是相关的,不同的虚拟机对于相同的符号引用所翻译出来的直接引用一般是不同的。如果有了直接引用,那么直接引用的目标一定被加载到了内存中。 直接引用可以是:
闻说社
2025/03/18
550
JVM之符号引用和直接引用
LeetCode第28/35题
Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
用户3112896
2019/09/26
4270
字符串基础题
总结:所有题目都已做,有些Easy没有做第二遍,有两道没有accept,请戳 link-en, link-cn
王脸小
2019/11/02
9730
字符串与内存函数的介绍+模拟实现
C语言中对字符和字符串的处理很是繁琐,但是C语言本身是没有字符串类型的字符串通常存放在常量字符串或者字符数组中。 字符串常量适用于那些对它不做修改的字符串函数。
Yui_
2024/10/16
940
字符串与内存函数的介绍+模拟实现
零基础学Java(4)字符串
从概念上讲,Java字符串就是Unicode字符序列。例如,字符串"Java\u2122"由5个Unicode字符J、a、v、a和™组成。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,很自然地叫做String。每个双引号括起来的字符串都是String类中的一个实例
全栈程序员站长
2022/09/19
3790
java开发_org.apache.commons.lang.StringUtils工具类源码
http://www.cnblogs.com/hongten/archive/2012/11/08/java_null.html
Hongten
2018/09/13
2.5K0
字符串函数的运用和理解(1)
Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.
薛定谔方程难
2024/01/23
1380
字符串函数的运用和理解(1)
Java工具集-字符串(StringUtils)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/10/28
1.6K0
Java从入门到精通六(java中的字符串变量String,StringBuilder,StringBuffer)
首先我们认识到java中的数据类型分为基本数据类型和引用数据类型。基本数据类型分为数值,字符,布尔,而引用数据类型分为类,接口,数组。 String是属于引用数据类型的。因为String本身就是一个类 需要了解基本数据类型和引用数据类型的区别。基本数据类型是直接存储在内存的栈上的,引用数据类型继承自Object类,按照对象的内存模式进行存储。我们的引用存放在内存的栈上,而对于对象本身的值存放在内存的堆上。我们java中通过new出来的对象就会存放在堆中。
兰舟千帆
2022/07/16
1.5K0
Java从入门到精通六(java中的字符串变量String,StringBuilder,StringBuffer)
相关推荐
字符串匹配算法从indexOf函数讲起
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验