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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王建亮 中级黑马   /  2015-6-12 12:15  /  1887 人查看  /  20 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王建亮 于 2015-6-12 12:31 编辑

在java解惑中看到了一个题目,觉得蛮有意思的,拿出来分享一下
  1. Random random = new Random();
  2.                 StringBuffer sb = null;
  3.                 switch(random.nextInt(2)){
  4.                 case 1:
  5.                         sb = new StringBuffer('M');
  6.                 case 2:
  7.                         sb = new StringBuffer('N');
  8.                 default:
  9.                         sb = new StringBuffer('H');
  10.                 }
  11.                 sb.append('a');
  12.                 sb.append('i');
  13.                 sb.append('d');
  14.                 System.out.println(sb);
复制代码
输出的sb的内容是什么?


20 个回复

正序浏览
Haid        case穿透了
回复 使用道具 举报
Haid,case穿透了
回复 使用道具 举报
学习到了 谢谢分享
回复 使用道具 举报
王建亮 发表于 2015-6-12 22:15
int类型的构造函数是用来初始化一个指定容量大小的StringBuffer,而不是内容 ...

原来是这个样子,学习了
回复 使用道具 举报
D.reamJA 发表于 2015-6-12 21:32
char不是可以强制转换成int么?既然有int类型的构造函数,通过强转可以让char变成int啊。为什么就把MNH吃 ...

它new了三次的StringBuffer,所以只有最后一次的是给sb赋对象,而char会自动提升为int,走int构造。
回复 使用道具 举报
这题蛮有意思,sb = new StringBuffer('M'),sb引用指向容量为(int)M的大小的StringBuffer容器,后面就是往容器里面加入元素了。
回复 使用道具 举报
D.reamJA 发表于 2015-6-12 21:32
char不是可以强制转换成int么?既然有int类型的构造函数,通过强转可以让char变成int啊。为什么就把MNH吃 ...

int类型的构造函数是用来初始化一个指定容量大小的StringBuffer,而不是内容
回复 使用道具 举报
gainn 发表于 2015-6-12 21:04
有意思……不过指定StringBuffer类型的初始容量长度有何意义?反正它的实际元素都可以无限添加…… ...

指的是初始容量,就和集合似的,都有一个初始容量
回复 使用道具 举报
王建亮 发表于 2015-6-12 20:47
这个的关键是StringBuffer并没有提供关于参数为char类型的构造函数,而是提供了一个int类型参数的构造函数 ...

char不是可以强制转换成int么?既然有int类型的构造函数,通过强转可以让char变成int啊。为什么就把MNH吃掉了呢?应该是对应的int值啊?
回复 使用道具 举报
我觉得应该是~~~~~   Haid
回复 使用道具 举报
gainn 中级黑马 2015-6-12 21:04:36
11#
王建亮 发表于 2015-6-12 20:47
这个的关键是StringBuffer并没有提供关于参数为char类型的构造函数,而是提供了一个int类型参数的构造函数 ...

有意思……不过指定StringBuffer类型的初始容量长度有何意义?反正它的实际元素都可以无限添加……
回复 使用道具 举报
这个的关键是StringBuffer并没有提供关于参数为char类型的构造函数,而是提供了一个int类型参数的构造函数,所以在sb中不会有M或者N或者H,case中的char都会变成相应的int值来创建具有初始容量的StringBuffer,因此sb中只会有aid,输出的自然是 aid 了
回复 使用道具 举报

Haid
是不是
产生的随机数0或者1.
0的时候运行defult
1的时候case穿透还是这个结果
回复 使用道具 举报
mishisanyi 发表于 2015-6-12 18:40
很简单,看api嘛
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间 ...

不用看这个解释了,是个错误:#丢脸了
回复 使用道具 举报
我说错了,真是不好意思,看样子我还要好好学习
StringBuffer()
          构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
StringBuffer(CharSequence seq)
          public java.lang.StringBuilder(CharSequence seq) 构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。
StringBuffer(int capacity)
          构造一个不带字符,但具有指定初始容量的字符串缓冲区。
StringBuffer(String str)
          构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。

sb = new StringBuffer('N');使用这句话,实际是调用
StringBuffer(int capacity) 这个构造方法,
          构造一个不带字符,但具有指定初始容量的字符串缓冲区。
回复 使用道具 举报
很简单,看api嘛
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
一旦初始化后,是无法修改其引用的
回复 使用道具 举报
有点意思。。。
回复 使用道具 举报
有什么意思
回复 使用道具 举报
                             aid
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马