发布
社区首页 >问答首页 >“M”到哪里去了?

“M”到哪里去了?
EN

Stack Overflow用户
提问于 2016-02-23 15:08:05
回答 4查看 240关注 0票数 3

我在字符串缓冲区上玩了一会儿,注意到混合字符和字符串是个坏主意。我希望下面的代码能打印"Main",但是我刚刚得到了一个"ain“。

很明显,word是用字符串缓冲区构造函数的char版本初始化的,但是我测试了几个方法,比如toString或getIndex( ),但是找不到"ain“之外的任何东西--这让我想知道:构造函数做了什么?它有什么用途吗?“M”能从单词中被检索到吗?

代码语言:javascript
代码运行次数:0
复制
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);
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-23 15:12:59

除了break问题之外,这里的主要问题是如何初始化您的StringBuffer

没有构造函数接受char作为参数,对于能力

这就是你用的那个..。

你应该这样做:

代码语言:javascript
代码运行次数:0
复制
word = new StringBuilder(); // not StringBuffer
// switch. Then:
word.append("ain");

(还请注意StringBuilder的使用,而不是StringBuffer;后者仅在需要线程安全的罕见情况下才有用)

票数 18
EN

Stack Overflow用户

发布于 2016-02-23 15:13:10

代码的问题非常简单:

new StringBuffer('M')不做你认为它做的事情。StringBuffer不存在期望使用char的构造函数。相反,这个构造函数名为:StringBuffer(int capacity)char被隐式转换为int

因此,基本上您的代码不会创建一个包含单个字符的新StringBuffer,而是一个具有与给定字符匹配的容量的StringBuffer

但是还有其他一些问题,比如在每个break的末尾缺少case,所以在word语句之后,word将永远是new StringBuffer('M');

此编译的原因是原始拓宽转换。基本上,任何积分数据类型都可以转换成另一个完整的数据类型,只要转换是无损失的.下面是一些进一步阅读的链接:

StringBuffer文档

原始加宽- JLS

票数 13
EN

Stack Overflow用户

发布于 2016-02-23 15:13:20

它使用StringBufferint构造函数来设置初始缓冲区的容量。

它为什么使用int构造函数?这与拓宽本原转换有关。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35581042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档