java 重写 contains_java String类的contains是如何实现的

一、使用contains的一个demo

public class Test {

public static void main(String[] args) {

String a="hello";

String b="hell";

System.out.println(a.contains(b));

}

}

打印输出:true

二、源码分析

​ s代表目标的字符串,是否包含的的串

public boolean contains(CharSequence s) {

return indexOf(s.toString()) > -1;

}

从目标字符串的第0个位置开始比对

public int indexOf(String str) {

return indexOf(str, 0);

}

public int indexOf(String str, int fromIndex) {

return indexOf(value, 0, value.length,

str.value, 0, str.value.length, fromIndex);

}

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++) {

//找到第一个相等的字符串

if (source[i] != first) {

while (++i <= max && source[i] != first);

}

//找到第一字符相等后,判断剩下的十分相等

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) {

//找到了包含的串

return i - sourceOffset;

}

}

}

//没有找到相等的串

return -1;

}

三、总结步骤

1、做前置工作

​ 如果目标串的长度为0,则任意字符串包含空串

2、找出在源串中可以移动的最大位置

3、根据在源串中可以移动的位置,找出第一个相等的串

4、判断源串的是否包含剩下的串

5、如果找到直接返回在源串的开始的位置

6、没有找到重复3、4、5

7、当没有符合的时候返回-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值