我在String Buffer中玩了一下,注意到混合字符和字符串是一个坏主意。我希望我的下面的代码可以打印#34; Main"但是只是得到了一个" ain"。
显然,word是使用String Buffer构造函数的char版本初始化的,但是我测试了几个方法,比如toString或getIndex(),但是在#34; ain"之后找不到任何东西。 - 这让我想知道:构造函数做了什么?它有用吗?可以' M'不知怎的,从单词中再次检索?
import java.util.Random;
public class OrNotPublicClass {
private static Random rnd = new Random();
public static void main(String[] args) {
StringBuffer word = null;
switch (rnd.nextInt(2)) {
case 1:
word = new StringBuffer('P');
case 2:
word = new StringBuffer('G');
default:
word = new StringBuffer('M');
}
word.append("ain");
System.out.println(word);
}
}
答案 0 :(得分:18)
除break
问题外,此处的主要问题是如何初始化StringBuffer
。
没有构造函数接受char
作为参数but there is one accepting an int
for the capacity。
这就是你使用的......
你应该这样做:
word = new StringBuilder(); // not StringBuffer
// switch. Then:
word.append("ain");
(另请注意使用StringBuilder
代替StringBuffer
;后者仅在需要线程安全的罕见情况下才有用)
答案 1 :(得分:13)
您的代码问题非常简单:
new StringBuffer('M')
不符合您的想法。 StringBuffer
没有期望char
的构造函数。而是调用此构造函数:StringBuffer(int capacity)
,char
被隐式转换为int
。
所以基本上你的代码不会创建一个包含单个字符的新StringBuffer
,而是一个容量与给定字符匹配的StringBuffer
。
但是还有一些其他问题,例如在每个break
的末尾遗漏case
,因此在切换语句后,word
始终为new StringBuffer('M');
< / p>
这个编译的原因是原始扩展转换。基本上任何积分数据类型都可以转换为另一种积分数据类型,只要转换是无损耗即可。以下是一些进一步阅读的链接:
StringBuffer docs
Primitive Widening - JLS
答案 2 :(得分:3)
它使用了mysqld_safe Starting mysqld daemon with databases from /Users/xxx/Documents/dev/MySQL/data
mysqld_safe mysqld from pid file /Users/xxx/Documents/dev/MySQL/data/xxx.pid ended
的{{1}}构造函数来设置初始缓冲区的容量。
为什么使用int构造函数?它与Widening Primitive Conversion有关。
答案 3 :(得分:1)
没有StringBuffer构造函数接受char。这里发生的是Java已经widening primitive conversion将char
转换为int
,然后创建了初始容量为StringBuffer
的{{1}}。< / p>
但是,有一个接受77
的构造函数,你可以用它来解决你的问题:
String
无论如何,还建议您使用StringBuffer buffer = new StringBuffer("M");
,它被设计为在单个线程使用字符串缓冲区的地方更快速地替换StringBuilder
。