• 消融
    2019-07-19
    public boolean startsWith(String prefix, int toffset) {
            // Note: toffset might be near -1>>>1.
            if (toffset < 0 || toffset > length() - prefix.length()) {
                return false; //这是指寻找位置小于0或大于字符串长度返回false吗, length() - prefix.length()这指的是字符串长度吗为什么要- prefix.length()
            }
            byte ta[] = value; //这ta[]指向哪啊
            byte pa[] = prefix.value; //.value是啥意思
            int po = 0;
            int pc = pa.length;
            if (coder() == prefix.coder()) { //这个if语块干什么呀
                int to = isLatin1() ? toffset : toffset << 1;
                while (po < pc) {
                    if (ta[to++] != pa[po++]) {
                        return false;
                    }
                }
            } else {
                if (isLatin1()) { // && pcoder == UTF16 //这个if又干什么了
                    return false;
                }
                // coder == UTF16 && pcoder == LATIN1)
                while (po < pc) {
                    if (StringUTF16.getChar(ta, toffset++) != (pa[po++] & 0xff)) {
                        return false; //这个if我也不明白
                   }
                }
            }
            return true;
        }
    展开

    作者回复:
    首先解释一下两个参数,prefix就是要判断的开头,如果要判断abcde是否以ab开头,那么就应该用ab做参数。toffset就是从源字符串的第几个字符开始找,这里源字符串就是abcde

    所以return false这个语句的意思是,如果调用这个方法的时候,说要从负的索引开始,或者从某个已经明显不够匹配prefix的位置开始, 就直接返回false

    ta指向的是字符串自己的bytes,是String类的成员变量。
    pa就算传进来的参数的bytes,同上是String类的成员变量。

    后面和coder相关的几个if判断应该是和编码相关的,这里实现的地方用的是byte数组而非char数组,所以要检查其编码

    最后的return false就是不startWith, 比如abcde不是以acd开头的,匹配到第二个字符,b不等于c,就return false

    
     2
  • 消融
    2019-07-19
    老师在上个问题中编码上已经检查了,最后为什么还要检查char,这不是重复吗

    作者回复: while循环是逐个字符比较,如果都匹配prefix就是startwith为true,否则为false

    
    
  • 消融
    2019-07-19
    老师源代码里是这样toffset > length() - prefix.length()。 doc上是这样 greater than the length of this String object; length() - prefix.length() 这个是指字符串长度吗???

    作者回复: 用两个问号结束问题看得出你很焦急呀。如果再加上几个感叹号,我隔着屏幕都能嗅到你如饥似渴的学习热情了。

    我在最后一章有一节专门聊了聊怎么问问题。同时池建强老师的卖桃者说第三期专门讲怎么问问题,打开极客时间App,主页上就有。

    就你现在这个问题,有两点硬伤:
    1)代码不全,每个人用的JDK可能都不一样,相应的方法的实现代码也不一样。即使都是Oracle的JDK,即使大版本一样,小版本升级也有可能会有代码的改变。如果你想得到准确的回答,应该贴出你看到的代码
    2)问题不是很清晰。应该说出你是怎么思考的,把自己的想法说清楚。首先,把自己看懂的说清楚;然后,再说自己从哪里开始没看懂。别人的回答才可能更有针对性。因为可能你认为你看懂的部分,也是不对的,造成你对后面代码的作用的理解有偏差。

    
    
  • 消融
    2019-07-19
    老师StartsWIth和EndsWith是怎么判断字符串的前缀和后缀的

    作者回复: 一个一个字符的比较。具体的代码实现因jdk版本不同而不同

    
    
我们在线,来聊聊吧