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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蓝枫 中级黑马   /  2014-3-19 10:33  /  1162 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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);这句话能不能帮我重点解读一下!麻烦各位!

6 个回复

倒序浏览
把sb当中的元素从第1个开始,到4-1=3个元素结束,复制到chs数组,开始位置是1

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
optimisticpig 来自手机 中级黑马 2014-3-19 11:20:57
藤椅
将sb4容器中的元素从第一位开始,到4的位置结束(不包括4),共4-1个元素,复制到chs数组,其实位置为1就。注:以上所提到的位置均为脚标
回复 使用道具 举报
结果是:
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开始

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
chen20134 发表于 2014-3-19 11:22
结果是:
chs[0]=
chs[1]=b

我打印的结果为什么是


chs [0]=a
chs [1]=b
chs [2]=c
chs [3]=d
回复 使用道具 举报
先来看看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

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
蓝枫 中级黑马 2014-3-19 15:20:37
7#
谢谢你!回答的非常详细!明白了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马