黑马程序员技术交流社区

标题: 关于StringBuffer的程序,请教各位! [打印本页]

作者: 蓝枫    时间: 2014-3-19 10:33
标题: 关于StringBuffer的程序,请教各位!
  1. class Demo
  2. {
  3.         public static void method_6()
  4.         {
  5.                 StringBuffer sb = new StringBuffer("abcdef");
  6.                         char[] chs= new char[4];
  7.             sb.getChars(1,4,chs,1);
  8.                         for(int x=0;x<chs.length;x++)
  9.                
  10.                           {
  11.                                  sop("chs["+x+"]="+chs[x]);
  12.                           }
  13.         }

  14.         public static void main(String[] args)
  15.         {
  16.         
  17.       method_6();
  18.         }
  19.         public static void sop(String str)
  20.         {
  21.                 System.out.println(str);
  22.         }
  23. }
复制代码

谁能告诉我,上面的这个程序执行的结果是什么? sb.getChars(1,4,chs,1);这句话能不能帮我重点解读一下!麻烦各位!
作者: 歌尽繁华    时间: 2014-3-19 10:51
把sb当中的元素从第1个开始,到4-1=3个元素结束,复制到chs数组,开始位置是1
作者: optimisticpig    时间: 2014-3-19 11:20
将sb4容器中的元素从第一位开始,到4的位置结束(不包括4),共4-1个元素,复制到chs数组,其实位置为1就。注:以上所提到的位置均为脚标
作者: chen20134    时间: 2014-3-19 11:22
结果是:
chs[0]=
chs[1]=b
chs[2]=c
chs[3]=d

StringBuffer的API中可以查到这个方法:

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
从当前StringBuffer对象的索引号srcBegin开始,到srcEnd结束的子串,赋值到字符数组dst中,并且从dst的索引号dstBegin开始。
也就是说从sb当中的元素的第1个开始,到4-1=3个元素结束,也就是'bcd'复制到chs数组,位置从1开始
作者: 蓝枫    时间: 2014-3-19 12:02
chen20134 发表于 2014-3-19 11:22
结果是:
chs[0]=
chs[1]=b

我打印的结果为什么是


chs [0]=a
chs [1]=b
chs [2]=c
chs [3]=d
作者: 王竞    时间: 2014-3-19 13:43
先来看看StringBuillder的API:
getChars
public void getChars(int srcBegin,
                     int srcEnd,
                     char[] dst,
                     int dstBegin)将字符从此序列复制到目标字符数组 dst。要复制的第一个字符在索引 srcBegin 处;要复制的最后一个字符在索引 srcEnd-1 处。要复制的字符总数为 srcEnd-srcBegin。要复制到 dst 子数组的字符从索引 dstBegin 处开始,结束于以下索引:

dstbegin + (srcEnd-srcBegin) - 1

参数:
srcBegin - 从此偏移量处开始复制。
srcEnd - 在此偏移量处停止复制。
dst - 用来保存复制数据的数组。
dstBegin - dst 中的偏移量。
抛出:
NullPointerException - 如果 dst 为 null。
IndexOutOfBoundsException - 如果以下任意一项为 true:
srcBegin 为负
dstBegin 为负
srcBegin 参数大于 srcEnd 参数。
srcEnd 大于 this.length()。
dstBegin+srcEnd-srcBegin 大于 dst.length


从上面的API内容中我们可以清楚、明白的看到这个getChars的方法的作用。
sb.getChars(1,4,chs,1);这个语句,sb这个字符串可以当做一个数组来看,其中的数字相当于是脚标,从1到4,要复制的字符总数为 srcEnd-srcBegin。计算出来为3个字符,chs表示要复制到的目的char数组,是从脚标1开始的,所以数组的大小刚好能够容纳下得到的字符。

如果将这个语句改为 sb.getChars(1,4,chs,      2);那么将会抛出java.lang.ArrayIndexOutOfBoundsException的异常,

所以在设置目的字符数组的大小和起始位置的时候一定要注意这些细节性的问题,不然就会抛异常,如果胡乱的抛出异常,可能会导致数据的丢失。

建议你在遇到这种问题的时候先去查看一个API,然后这种问题自己就明白了,要养成勤看API的习惯,张孝祥老师不是说过,老师和我们的区别就是,老师熟悉一个问题的思路,以及懂的api比我们多,他们知道如何去查api
作者: 蓝枫    时间: 2014-3-19 15:20
谢谢你!回答的非常详细!明白了。




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