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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘旭升 高级黑马   /  2013-12-26 22:32  /  2073 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘旭升 于 2013-12-27 10:01 编辑
  1. package test;
  2. public class Stringbuffer {
  3.         public static void main(String[]args){
  4.                 StringBuffer s =new StringBuffer("");
  5.                 for(int i=0;i<10000;i++)
  6.                 {        i=(char)i;
  7.                         s.append(i);
  8.                 }
  9.                 System.out.println("最终结果为"+s);//注释掉了s=,避免混淆。
  10.         }
  11. }
复制代码
//为何打印为(s=)    然后就没了?
我想问的是:的值怎么不显示?【①经调试,发现i=(char)i;需要改成char j=(char)i;然后s.append(j);打印字符效果。且:10000不行,改成1000便可。现在想获知当1000时,s的有少位字符?】
【②在看完大家给的建议和方法后,整理一下得出:eclipse处理是有小问题(控制显示文本框长度限制了,程序没错的情况下就取消显示。),上新代码:】
  1. class St{
  2.         public static void main(String[]args){
  3.                 StringBuffer s =new StringBuffer("");
  4.                 for(int i=0;i<10000;i++)
  5.                 {        i=(char)i;
  6.                         s.append(i);
  7.                 }
  8.                 long a=s.length();
  9.                 System.out.println("最终结果为"+s);//注释掉了s=,避免混淆。
  10.                 System.out.println("字符长度为:"+a);
  11.         }
  12. }
复制代码

在命令行中打印正确,并得到长度为:38890。
感谢郭振华、、



评分

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

查看全部评分

16 个回复

倒序浏览
没有最大长度限制,但是不能无限大,这个要根据你的内存大小而定的。

StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候,因为没有设置初始化字符长度,StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当StringBuffer达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2旧值+2)。

  1. public class Stringbuffer {
  2.         public static void main(String[] args) {
  3.                 StringBuffer s = new StringBuffer("");
  4.                 for (int i = 0; i < 5; i++) {
  5.                         i = (char) i;
  6.                         s.append(i);
  7.                 }
  8.                 //这就可以输出
  9.                 System.out.println("s=" + s);
  10.         }
  11. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
我跑过,没有问题
回复 使用道具 举报
我也试过了,没问题,2楼说的也太悬了,java虚拟机最起码能获得100mb++内存,不差这几k
回复 使用道具 举报
本帖最后由 75100313 于 2013-12-26 22:57 编辑
郭振华 发表于 2013-12-26 22:48
我也试过了,没问题,2楼说的也太悬了,java虚拟机最起码能获得100mb++内存,不差这几k ...

我不会插图片  你运行出来的结果是什么  ? 我运行出来的就是s=
回复 使用道具 举报
冯晓骏 发表于 2013-12-26 22:44
我跑过,没有问题

没问题就把结果打出来  让大伙看看
回复 使用道具 举报
75100313 发表于 2013-12-26 22:43
没有最大长度限制,但是不能无限大,这个要根据你的内存大小而定的。

StringBuffer在内部维护一个字符数组 ...

那也不应该不打印吧,你把10000改成100,可以打印出来吗?
回复 使用道具 举报
郭振华 发表于 2013-12-26 22:48
我也试过了,没问题,2楼说的也太悬了,java虚拟机最起码能获得100mb++内存,不差这几k ...

结果是什么?不会也是s=  
你看下代码,为何那个s没有值,就是没有打印出来?我想问这个原因
回复 使用道具 举报
刘旭升 发表于 2013-12-26 23:09
那也不应该不打印吧,你把10000改成100,可以打印出来吗?

可以的你看

s=0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899

评分

参与人数 1技术分 +1 收起 理由
To + 1 鼓励

查看全部评分

回复 使用道具 举报
本帖最后由 刘旭升 于 2013-12-26 23:23 编辑
75100313 发表于 2013-12-26 23:14
可以的你看

s=0123456789101112131415161718192021222324252627282930313233343536373839404142434445464 ...

我改成1000也能打印。变成char-->
  1. package test;
  2. public class Stringbuffer {
  3.         public static void main(String[]args){
  4.                 StringBuffer s =new StringBuffer("");
  5.                 for(int i=0;i<1000;i++)
  6.                 {        char j=(char)i;
  7.                         s.append(j);
  8.                 }
  9.                 System.out.println("最终结果为:"+s);
  10.         }
  11. }
  12. //StringBuffer append(char c)
复制代码

DV]WA])E6YK6RJVD[NHMXPE.jpg (26.98 KB, 下载次数: 37)

DV]WA])E6YK6RJVD[NHMXPE.jpg
回复 使用道具 举报
刘旭升 发表于 2013-12-26 23:21
我改成1000也能打印。变成char-->

char 是2个字节  int是4个字节。。。。所以 我还坚持我上面 的结论吧  再看看其他人怎么回答
回复 使用道具 举报
75100313 发表于 2013-12-26 23:25
char 是2个字节  int是4个字节。。。。所以 我还坚持我上面 的结论吧  再看看其他人怎么回答 ...

问题变了,你再看看现在的问题,帮忙解决下
回复 使用道具 举报
天啊,这个。。
回复 使用道具 举报
75100313 发表于 2013-12-26 22:58
没问题就把结果打出来  让大伙看看

还是没有问题

22.png (111.63 KB, 下载次数: 36)

22.png
回复 使用道具 举报
回答楼主补充问的问题:
如果你使用缺省值,初始化之后接着往里面追加字符,在你追加到第16个字符的时候它会将容量增加到34(2*16+2),当追加到34个字符的时候就会将容量增加到70(2*34+2).
楼主想知道1000的长度。按照先前那样算下去。是1150.

评分

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

查看全部评分

回复 使用道具 举报
75100313 发表于 2013-12-26 22:55
我不会插图片  你运行出来的结果是什么  ? 我运行出来的就是s=

程序是没问题的,我没你考虑的那么细致,你的观点我感觉也很新鲜
我一开始是用eclipse跑的,昨天晚上确实出来了,但是今天早起,却出不来。我尝试做debug,发现到5000还是没问题的,一直在append。然后我就考虑是不是eclipse 的问题,我就在命令行下跑了一下字节码文件。证明了,确实是eclipse 的问题。具体的,为什么,超出我的理解了。
图片我就不上传了,我搞了一会,上传不了
回复 使用道具 举报
刘旭升 发表于 2013-12-26 23:11
结果是什么?不会也是s=  
你看下代码,为何那个s没有值,就是没有打印出来?我想问这个原因 ...

s有值的,结构是0-9999的字符串形式的连接。eclipse有时会打印,有时不会,看缘分了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马