startsWith源码分析

在Java编程中,我们有时会遇到判断当前字符串是否会以另外的字符串开始。此时我们就会用到startsWith来检测某字符串是否以另一个字符串开始,返回值为boolean类型。

目标

本次源码分析的目标是深入了解String startsWith方法的实现机制。

简单了解starsWith

首先我们先来简单了解一下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方法的重载,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方法是将其比较的字符串转化为字符数组,在字符串数组中一个一个比较。

你可能感兴趣的:(startsWith源码分析)