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

Posted 韩旭051

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 源码 关于 字符串的包含 原来就是强行的匹配相关的知识,希望对你有一定的参考价值。

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

String 的 contains 方法

 String s = new String("aaa");
        s.contains("a");

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

上源码

    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.
*/

  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;// 🙅‍♂️ 到最后也没成功 ❌
    }

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

以上是关于Java 源码 关于 字符串的包含 原来就是强行的匹配的主要内容,如果未能解决你的问题,请参考以下文章

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

java里关于String的编码与解码

如何强行卸载自己windows下的python-CSDN论坛

Java继承原来就是这样

JDK源码阅读开始--Object类

SpringBoot读取配置文件源码探究