黑马程序员技术交流社区

标题: StringBuffer的repalce(int start,int end,string str)中,end值不会越界猜测 [打印本页]

作者: 左右.律    时间: 2016-9-7 00:31
标题: StringBuffer的repalce(int start,int end,string str)中,end值不会越界猜测
通常,对带有index值的操作都需要限制在长度范围内操作,而当超过范围后就会抛出角标越界异常,比如:
[AppleScript] 纯文本查看 复制代码
StringBuffer sb = new StringBuffer();
                sb.append("hello").append("world");
                String str = sb.substring(5,11);

    然而,StringBuffer中却有一个方法特别例外,那就是replace()方法,我们先看下其格式:
[AppleScript] 纯文本查看 复制代码
StringBuffer replace(int start, int end, String str)

    练习是发现,对end的值给定在int范围内变化的实参,都是不会抛出角标异常的,比如:
[AppleScript] 纯文本查看 复制代码
StringBuffer sb = new StringBuffer();
                sb.append("hello").append("world");
                String str = sb.substring(5,10);
               
                sb.replace(0, 1000, "后宫佳丽三千人,铁杵也能磨成针");
                System.out.println(sb);

    这样是不会报错,结果输出:后宫佳丽三千人,铁杵也能磨成针
    那原理是什么呢?
    查看源码后有一句比较在意:
[AppleScript] 纯文本查看 复制代码
if (end > count)
            end = count;
        int len = str.length();
        int newCount = count + len - (end - start);

[AppleScript] 纯文本查看 复制代码
public int length() {
        return count;
    }

    可以发现,当值比StringBuffer长度大的时候,会默认转换为StringBuffer的长度,然后得到一个新的长度为:count + len - (end - start),所以,这里会有一个巧妙的转换,但是我还是不太知道为什么要这么做,难道是为了可以尽可能地替换更多的内容吗?求指导.
作者: Zzh94520    时间: 2016-9-7 18:45
大神。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2