' M'走?

时间:2016-02-23 15:08:06

标签: java

我在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);
    }
}

4 个答案:

答案 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 conversionchar转换为int,然后创建了初始容量为StringBuffer的{​​{1}}。< / p>

但是,有一个接受77的构造函数,你可以用它来解决你的问题:

String

无论如何,还建议您使用StringBuffer buffer = new StringBuffer("M"); ,它被设计为在单个线程使用字符串缓冲区的地方更快速地替换StringBuilder