在Java编程中,我们有时会遇到判断当前字符串是否会以另外的字符串开始。此时我们就会用到startsWith来检测某字符串是否以另一个字符串开始,返回值为boolean类型。
本次源码分析的目标是深入了解String startsWith方法的实现机制。
首先我们先来简单了解一下startsWith:
例如:if(a.startsWith(b)) //判断字符串a 是不是以字符串b开头。
然后进行编写简单的startsWith测试代码:
public class A {
public static void main(String[] args) {
String str = "hello,world!";
System.out.println(str);
String startstr1 = "hello";
String startstr2 = "world";
boolean retval1 = str.startsWith(startstr1);
boolean retval2 = str.startsWith(startstr2);
System.out.println("starts with " + startstr1 + " ? " + retval1);
System.out.println("starts with " + startstr2 + " ? " + retval2);
}
}
其输出结果为:starts with hello ? true
starts with world ? false
(1).为什么输出结果会是这样了?startsWith在后面是怎么实现的呢?
这时候我们Ctrl+B进入startsWith的实现,这时我们会看见:
public boolean startsWith(String prefix) {
return startsWith(prefix, 0);
}
(2)此时大家可能会有些疑惑,变量prefix指的是什么呢?这两行代码又是什么意思?
我作简单解释:
参数:prefix为指定的前缀。
返回值:如果参数表示的字符序列是此字符串表示的字符序列的前缀,则返回true;否则返回false。如果参数是空字符串,或者等于此String对象(用equals(Object)方法确定),则返回true。
当我们知道返回值的原理时,我们就进入String的startsWith方法源码:
(1)分析源码含义:
public boolean startsWith(String prefix, int toffset) {
//被比较的字符串,转换为字符数组
char ta[] = value;
//比较开始的起始位置
int to = toffset;
//比较的字符串转换为字符数组
char pa[] = prefix.value;
int po = 0;
//比较的字符串长度
int pc = prefix.value.length;
//判断比较的起始点是否小于0或者起始点的开始位置无法将比较字符串比较完
if ((toffset < 0) || (toffset > value.length - pc)) {
return false;
}
//循环比进行对比较字符串数组的字符一个一个比较是否相等
while (--pc >= 0) {
//被比较字符串的从起始点开始与比较字符串数组一一比较
if (ta[to++] != pa[po++]) {
return false;
}
}
return true;
}
(2)大家可能会问到public boolean startsWith(String prefix , int toffset)中的prefix,toffset变量意义是什么?
参数:prefix为指定的前缀。
参数:toffset为在字符串中开始查找的位置。
返回值:如果参数表示的字符序列是此对象从索引toffset处开始的子字符串,则返回true;否则返回false。如果toffset为负或大于此String对象的长度,则结果为false;否则结果与该表达式的结果相同。
startsWith方法的重载,startsWith(String str,int index),当去网上查没有后面的方法,于是做了一下测试,在这给出详细解释,startsWith(String str)就是检查形参参数是否与你要检查的字符串开头相同,而startsWith(String str,int index)则是从你要比较的原字符串的指定下标开始和形参作比较,这里边str.startsWith(String str)和str,startsWith(String str,0)是没有区别的,下面就看看代码吧!
String st1=”dsadas”;
System.out.println(“st1:”+st1.startsWith(“sa”,1));
String st2=”dsadas”;
System.out.println(“st1:”+st2.startsWith(“sa”));
String st3=”dsadas”;
System.out.println(“st2:”+st3.startsWith(“ds”));
String st4=”dsadas”;
System.out.println(“st4:”+st4.startsWith(“ds”,0));
String st5=”dsadas”;
System.out.println(“st5:”+st5.startsWith(“ds”,1));
输出结果:
St1:true
St1:false
St1:true
St1:true
Str1:false
本文分析了String startsWith方法,包括startsWith方法的重载。通过分析我们知道了为什么返回值是true或false。并且我们也明白了startsWith方法是将其比较的字符串转化为字符数组,在字符串数组中一个一个比较。