我在字符串缓冲区上玩了一会儿,注意到混合字符和字符串是个坏主意。我希望下面的代码能打印"Main",但是我刚刚得到了一个"ain“。
很明显,word是用字符串缓冲区构造函数的char版本初始化的,但是我测试了几个方法,比如toString或getIndex( ),但是找不到"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);
}
}
发布于 2016-02-23 07:12:59
除了break
问题之外,这里的主要问题是如何初始化您的StringBuffer
。
没有构造函数接受char
作为参数,对于能力。
这就是你用的那个..。
你应该这样做:
word = new StringBuilder(); // not StringBuffer
// switch. Then:
word.append("ain");
(还请注意StringBuilder
的使用,而不是StringBuffer
;后者仅在需要线程安全的罕见情况下才有用)
发布于 2016-02-23 07:13:10
代码的问题非常简单:
new StringBuffer('M')
不做你认为它做的事情。StringBuffer
不存在期望使用char
的构造函数。相反,这个构造函数名为:StringBuffer(int capacity)
,char
被隐式转换为int
。
因此,基本上您的代码不会创建一个包含单个字符的新StringBuffer
,而是一个具有与给定字符匹配的容量的StringBuffer
。
但是还有其他一些问题,比如在每个break
的末尾缺少case
,所以在word
语句之后,word
将永远是new StringBuffer('M');
。
此编译的原因是原始拓宽转换。基本上,任何积分数据类型都可以转换成另一个完整的数据类型,只要转换是无损失的.下面是一些进一步阅读的链接:
发布于 2016-02-23 07:13:20
它使用StringBuffer
的int
构造函数来设置初始缓冲区的容量。
它为什么使用int构造函数?这与拓宽本原转换有关。
https://stackoverflow.com/questions/35581042
复制