黑马程序员技术交流社区

标题: 有趣的java题,来自java解惑 [打印本页]

作者: 王建亮    时间: 2015-6-12 12:15
标题: 有趣的java题,来自java解惑
本帖最后由 王建亮 于 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的内容是什么?



作者: vilion    时间: 2015-6-12 12:27
??要表达什么
作者: 颜小岩    时间: 2015-6-12 16:59
                             aid
作者: edithe    时间: 2015-6-12 17:33
有什么意思
作者: 爱李萝卜    时间: 2015-6-12 18:09
有点意思。。。
作者: mishisanyi    时间: 2015-6-12 18:40
很简单,看api嘛
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
一旦初始化后,是无法修改其引用的
作者: mishisanyi    时间: 2015-6-12 18:58
我说错了,真是不好意思,看样子我还要好好学习
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) 这个构造方法,
          构造一个不带字符,但具有指定初始容量的字符串缓冲区。
作者: mishisanyi    时间: 2015-6-12 19:03
mishisanyi 发表于 2015-6-12 18:40
很简单,看api嘛
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间 ...

不用看这个解释了,是个错误:#丢脸了
作者: java8023    时间: 2015-6-12 19:59

Haid
是不是
产生的随机数0或者1.
0的时候运行defult
1的时候case穿透还是这个结果

作者: 王建亮    时间: 2015-6-12 20:47
这个的关键是StringBuffer并没有提供关于参数为char类型的构造函数,而是提供了一个int类型参数的构造函数,所以在sb中不会有M或者N或者H,case中的char都会变成相应的int值来创建具有初始容量的StringBuffer,因此sb中只会有aid,输出的自然是 aid 了
作者: gainn    时间: 2015-6-12 21:04
王建亮 发表于 2015-6-12 20:47
这个的关键是StringBuffer并没有提供关于参数为char类型的构造函数,而是提供了一个int类型参数的构造函数 ...

有意思……不过指定StringBuffer类型的初始容量长度有何意义?反正它的实际元素都可以无限添加……
作者: D.reamJA    时间: 2015-6-12 21:05
我觉得应该是~~~~~   Haid
作者: D.reamJA    时间: 2015-6-12 21:32
王建亮 发表于 2015-6-12 20:47
这个的关键是StringBuffer并没有提供关于参数为char类型的构造函数,而是提供了一个int类型参数的构造函数 ...

char不是可以强制转换成int么?既然有int类型的构造函数,通过强转可以让char变成int啊。为什么就把MNH吃掉了呢?应该是对应的int值啊?
作者: 王建亮    时间: 2015-6-12 22:14
gainn 发表于 2015-6-12 21:04
有意思……不过指定StringBuffer类型的初始容量长度有何意义?反正它的实际元素都可以无限添加…… ...

指的是初始容量,就和集合似的,都有一个初始容量
作者: 王建亮    时间: 2015-6-12 22:15
D.reamJA 发表于 2015-6-12 21:32
char不是可以强制转换成int么?既然有int类型的构造函数,通过强转可以让char变成int啊。为什么就把MNH吃 ...

int类型的构造函数是用来初始化一个指定容量大小的StringBuffer,而不是内容
作者: 武汉小菜鸟    时间: 2015-6-12 22:27
这题蛮有意思,sb = new StringBuffer('M'),sb引用指向容量为(int)M的大小的StringBuffer容器,后面就是往容器里面加入元素了。
作者: an_lucas    时间: 2015-6-12 22:33
D.reamJA 发表于 2015-6-12 21:32
char不是可以强制转换成int么?既然有int类型的构造函数,通过强转可以让char变成int啊。为什么就把MNH吃 ...

它new了三次的StringBuffer,所以只有最后一次的是给sb赋对象,而char会自动提升为int,走int构造。
作者: D.reamJA    时间: 2015-6-14 09:45
王建亮 发表于 2015-6-12 22:15
int类型的构造函数是用来初始化一个指定容量大小的StringBuffer,而不是内容 ...

原来是这个样子,学习了
作者: hieiyukina    时间: 2015-6-14 10:09
学习到了 谢谢分享
作者: Monster    时间: 2015-6-14 10:18
Haid,case穿透了
作者: Monster    时间: 2015-6-14 10:19
Haid        case穿透了




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