无法打印字符串缓冲区

时间:2015-05-01 15:28:13

标签: java multithreading

我试图使用线程打印出0到30之间的奇数,但我似乎无法获得Stringbuffer,我试图将我的数字存储到打印中。

public class THREAD extends Thread {
 public void run()
{
    for (int x=0; x<30; x++)
    {
     int y=-1;
     int n= y+2; 
    }
     StringBuffer numberslist = new StringBuffer(n);    
     System.out.println(numberslist);
}

public static void main(String args[])
{
    (new THREAD()).start();
}
}

1 个答案:

答案 0 :(得分:1)

如果这将编译(它不会因为int n仅在循环中可见),您将使用{{创建长度为1 * 的空StringBuffer() 3}}打电话。然后你打印它。由于它是空的(你已经使用了append(...)),它将打印一个空行。

如果您确实想要将整数的字符串表示形式添加到字符串缓冲区,则必须使用以下方法之一:

StringBuffer numbers = new StringBuffer(""+n);
// String.valueOf(n) calls Integer.toString(n)
StringBuffer numbers = new StringBuffer(Integer.toString(n));

(但这不是最好的主意,因为它以匹配的长度开头),或者使用追加变体:

StringBuffer numbers = new StringBuffer(); // default capacity
numbers.append(""+n);
numbers.append(Integer.toString(n));

(注意我也重命名了变量,因为缓冲区不是列表)。

打印奇数就好了(但是你也可以完全跳过缓冲区并打印):

StringBuffer numbers = new StringBuffer();
for (int i = 1; i < 30; i+=2) {
  if (i>1) numbers.append(','); // or space?
  numbers.append(Integer.toString(i));
}
System.out.println("odd numbers: " + numbers);

在所有示例中,您可以将StringBuffer替换为更现代的StringBuilder - 它不会改变输出但速度更快。但是,当您可以将结果流式传输时,最好不将结果存储在内存中:

System.out.print("odd numbers: "); // cursor stays on line
for (int i = 1; i < 30; i+=2) {
  if (i>1) System.out.print(",");
  System.out.print(Integer.toString(i));
}
System.out.println(); // next line

* 评论解释了为什么n = 1:你计算了n = -1 + 2;的结果的30倍