博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java String类 contains 函数底层算法
阅读量:7211 次
发布时间:2019-06-29

本文共 1923 字,大约阅读时间需要 6 分钟。

hot3.png

话不多说,直接上代码:

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;        }        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);            }            /* 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++);                if (j == end) {                    /* Found whole string. */                    return i - sourceOffset;                }            }        }        return -1;    }

核心代码如上,这indexOf函数用在很多地方,String ,StringBuffer, StringBuilder类的方法是用到过。apache有的包中替换函数也是用这个函数进行子串查找。我们分析一下参数。jdk注释如下:

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

这里说一下 String类, String类是对char基本类型的封装。直接上图:

143959_Gdgm_1045974.png

就是char型数组以及一个hash。

算法很简单,将两个字符串通过字符型数组来比较,从目标字符串中查找待查找串中的第一个字符,当找到,j、k 指针自增1后移。当移动长度到 之前计算的end的长度时结束,说明找到,否则没有找到。

转载于:https://my.oschina.net/xiaomianyang/blog/730629

你可能感兴趣的文章
如何看待阿里云加入Linux基金会金牌会员?
查看>>
三大应用需求:5G信道编码技术取得突破
查看>>
实例解读:如何减少Docker中的Java内存消耗
查看>>
测试JavaScript函数的性能
查看>>
TP-Link发布网格路由器Deco M5
查看>>
JP摩根预测:诺基亚2017年净利润将达14.21亿美元
查看>>
CDN行业“三足鼎立”格局已定,谁能代表未来?
查看>>
只“存活”9个月:Ubuntu 15.10今日停止支持
查看>>
淘汰Hyper-V replication 拥抱Storage Replica
查看>>
云服务器 ECS 建站教程:部署Linux主机管理系统WDCP
查看>>
Win10 Edge浏览器续航碾压火狐/Chrome
查看>>
蓄电池知识14问答
查看>>
中国将成为全球 APT 攻击的第一目标国,去年就有36个组织干中国,SOS!
查看>>
丑闻频出,Verizon收购雅虎价格恐缩水10亿美元
查看>>
陌陌看好的移动营销 Criteo表示尚未成为主流
查看>>
科通联手中兴 共同制定未来物联网标准
查看>>
打造智能家居安防系统 七个选购常识你需懂
查看>>
支援日本/厄瓜多尔震区 Skype推免费通话
查看>>
转账给张三,钱却被李四收到,如何狙击凶险的 App 漏洞?——专访娜迦CTO玩命...
查看>>
有些车已经不能再买了!因为国五排放标准就要来了!
查看>>