A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

通常,对带有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),所以,这里会有一个巧妙的转换,但是我还是不太知道为什么要这么做,难道是为了可以尽可能地替换更多的内容吗?求指导.

1 个回复

倒序浏览
大神。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马