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