String源码阅读之contains实现原理

举报
brucexiaogui 发表于 2021/12/30 01:49:51 2021/12/30
【摘要】 String源码阅读之contains实现原理 contains 对String中的contains方法进行分析,了解其采用的是什么算法进行匹配。 //用于判断源字符串是否包含目标字符序列 CharSequence s public boolean contains(CharSequence s) { //调用in...

String源码阅读之contains实现原理

contains

对String中的contains方法进行分析,了解其采用的是什么算法进行匹配。


  
  1. //用于判断源字符串是否包含目标字符序列 CharSequence s
  2. public boolean contains(CharSequence s) {
  3. //调用indexOf(String str)方法
  4. return indexOf(s.toString()) > -1;
  5. }

indexOf (String str)


  
  1. public int indexOf(String str) {
  2. //继续往下调用indexOf(String str, int fromIndex)方法,并传入匹配起始下标
  3. return indexOf(str, 0);
  4. }

indexOf (String str, int fromIndex)


  
  1. public int indexOf(String str, int fromIndex) {
  2. //继续往下调用indexOf(char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount,int fromIndex) 函数
  3. //传入源字符串,源字符串偏移量,源字符串长度,目标字符串,目标字符串偏移量,目标字符串长度,匹配源字符串的起始坐标
  4. return indexOf(value, 0, value.length,
  5. str.value, 0, str.value.length, fromIndex);
  6. }

indexOf (char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount,int fromIndex)


  
  1. static int indexOf(char[] source, int sourceOffset, int sourceCount,
  2. char[] target, int targetOffset, int targetCount,
  3. int fromIndex) {
  4. //若匹配的起始下标大于或等于源字符串的长度
  5. if (fromIndex >= sourceCount) {
  6. //检测目标长度是否为0,是则返回源字符串长度,否则返回-1
  7. return (targetCount == 0 ? sourceCount : -1);
  8. }
  9. //若匹配的起始下标小于0
  10. if (fromIndex < 0) {
  11. //将匹配的起始下标置0
  12. fromIndex = 0;
  13. }
  14. //若目标字符串长度等于0
  15. if (targetCount == 0) {
  16. //直接返回匹配的起始下标
  17. return fromIndex;
  18. }
  19. //从定义的目标偏移量中取出目标字符串的第一个字符
  20. char first = target[targetOffset];
  21. //获取源字符串能被匹配的最大长度
  22. int max = sourceOffset + (sourceCount - targetCount);
  23. //从定义的偏移量加上起始匹配下标开始进行匹配
  24. for (int i = sourceOffset + fromIndex; i <= max; i++) {
  25. /* Look for first character. */
  26. //检测第一个字符是否相等
  27. if (source[i] != first) {
  28. //不相等则循环匹配,直到找到能与目标字符串第一个字符匹配的源字符串下标。
  29. while (++i <= max && source[i] != first);
  30. }
  31. /* Found first character, now look at the rest of v2 */
  32. //已经找到了与目标字符串第一个字符匹配的源字符串下标,则从该下标的下一位开始,对目标字符串余下的字符进行匹配。
  33. if (i <= max) {
  34. //从该下标的下一位开始
  35. int j = i + 1;
  36. //定义本次匹配的最大长度
  37. int end = j + targetCount - 1;
  38. //循环匹配
  39. for (int k = targetOffset + 1; j < end && source[j]
  40. == target[k]; j++, k++);
  41. //j能一直增加到end,说明已经成功匹配
  42. if (j == end) {
  43. /* Found whole string. */
  44. //返回在源字符串中被匹配到的第一个字符的下标。
  45. return i - sourceOffset;
  46. }
  47. }
  48. }
  49. //没有匹配到,返回-1
  50. return -1;
  51. }

文章转载自:https://blog.csdn.net/u012454429/article/details/82852034

文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。

原文链接:brucelong.blog.csdn.net/article/details/95589451

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。