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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑文博 中级黑马   /  2012-6-26 11:52  /  2247 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑文博 于 2012-6-26 13:56 编辑

字符缓冲区删除操作举例:
  1. /*
  2. StringBuffer是字符串缓冲区。

  3. 是一个容器。
  4. 特点:
  5. 1,长度是可变化的。
  6. 2,可以直接操作多个数据类型。
  7. 3,最终会通过toString方法变成字符串。

  8.         删除:
  9.                 StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。
  10.                 StringBuffer deleteCharAt(index):删除指定位置的字符。
  11. */

  12. class StringBufferDemo
  13. {
  14.         public static void main(String[] args)
  15.         {
  16.                 method_del();
  17.         }
  18.         public static void method_del()
  19.         {
  20.                 StringBuffer sb  = new StringBuffer("abcde");
  21.                
  22.                 //sb.delete(1,3);
  23.                 //sb.delete(0,sb.length());//清空缓冲区。
  24.                 sop(sb.toString());
  25.         }        
  26.         public static void sop(String str)
  27.         {
  28.                 System.out.println(str);
  29.         }
复制代码
第26行清空缓冲区的操作为什么不是sb.length()+1呢?
由于看jdk注释中delete方法中参数说明是:start - The beginning index,inclusive.
                                                                  end - The ending index,exclusive.//也就是大家常说的“包含头不包含尾”。
既然如此这要想清空缓冲区势必是要把所有字符删掉,用sb.length()应该会保留最后以为才对啊。为什么运行结果和我想的不同?如果我对“包含头不包含尾”理解有误,也请大家给与帮助理解。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
本帖最后由 王涛 于 2012-6-26 13:36 编辑

class StringBufferDemo
{
        public static void main(String[] args)
        {
                method_del();
        }
        public static void method_del()
        {
                StringBuffer sb  = new StringBuffer("abcde");
               
                //sb.delete(1,3);
                //sb.delete(0,sb.length());//清空缓冲区。主要是这个sb.length()的问题,这个是获取sb字符串的长度,
                sop(sb.toString());           //你输入了"abcde",他的长度是5,所以sb.length()是5,sb.delete()删除的是角标
        }                                           //所以,你是直接sb.delete(0,5)那不是吧她删完了吗。
        public static void sop(String str)//
        {
                System.out.println(str);
        }
回复 使用道具 举报
因为你那上面sb.length()为5,而数组的指针式从0开始计算的,包含头不包含尾的话就是0——4,刚好是5位,也就是刚好把全部缓冲区清除了,如果你加上1清除的数据就会变成0——5这六个字符了,而字符的长度总共就5个,这样清除就会出现错误

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
//sb.delete(0,sb.length());//清空缓冲区。//sb.length());是sb的长度,从0角标数到sb.length())-1正好sb的长度sb.length());
回复 使用道具 举报
王涛 发表于 2012-6-26 12:14
class StringBufferDemo
{
        public static void main(String[] args)

呃 本来就觉得写的少一位 你这样就会让人觉得少两位了。。
回复 使用道具 举报
heima_dinghua 发表于 2012-6-26 13:32
15 .class StringBufferDemo

16.{

啊 对啊 应该是length-1加1的而不是lengt加1的。谢了啊
回复 使用道具 举报
在java中,数组和String 和StringBuffer这些类型的下表都是从0开始的。
举个例子吧
String s=“123456”;这个总共是6位,也就是用s.length();取出来的返回值为6
那么 要想单独得到‘1’这个字符的话,就得用到s.substring(0,1) ;这也就是你说的含头不含尾,以此类推那最后的一位的下表就应该是 s.length()-1;那么你刚才用的delete(0,sb.length());如果sb.length()=6的话,那么就就表示删除下边从0开始到5的所有字符。那么这样的话是不是就留不下最后一位了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马