2013-01-11 26 views
4

我正在做一个计算机科学项目,我需要合并StringBuffer。我需要什么.append做什么和什么连接手段的帮助。有人告诉我,我可以通过使用.appendStringBuffer来显示谁是赢家(我的游戏)。StringBuffer如何与.append一起使用

public static void winner() 
    { 
    if (position1 >= 100){ 
     System.out.println("THE WINNER IS " + name1); 
    } 
    else if (position2 >= 100){ 
     System.out.println("THE WINNER IS " + name2); 
    } 
    } 

而不必名字符串,我可以用StringBuffer给谁赢得了比赛的输出?

+2

两个字符串的单个串联与使用'StringBuffer'没有区别。 – Shivam

+0

改为使用'StringBuilder',你将长久赢利:) 反正它的工作原理就像这个'new StringBuilder(“WINNER IS”).append(name1).toString()',同样适用于'StringBuffer' – exexzian

回答

6

感谢编译器,您已经在使用StringBuilder这是StringBuffer的更新更快版本。

你上面的代码编译成等价的:

public static void winner() 
{ 
    if (position1 >= 100){ 
    System.out.println(new StringBuilder("THE WINNER IS ").append(name1).toString()); 
    } 
    else if (position2 >= 100){ 
    System.out.println(new StringBuilder("THE WINNER IS ").append(name2).toString()); 
    } 
} 

所以,在这种情况下,你就不会完成任何尚未正在为你做。当您在循环中构建String时,请使用StringBuilder

在你的情况下,他们很可能是在谈论初始化前两种情况下,单个的StringBuilder:

public static void winner() { 
    StringBuilder out = new StringBuilder("THE WINNER IS "); 
    if (position1 >= 100) { 
    out.append(name1); 
    } else if (position2 >= 100 { 
    out.append(name2); 
    } else { 
    return; // Preserve previous behavior just in case, remove this if it's not needed 
    } 
    System.out.println(out); 
} 
+0

谢谢,只是一个问题你在哪里声明** StringBuilder **? – user1965081

+0

全名是['java.lang.StringBuilder'](http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuilder.html),所以你不需要导入它。 – Brigham

1

可以,因为System.out.println会自动将其参数转换为String,因此产生的内容为StringBuffer。大多数情况下,当你需要迭代一组数据时,你会使用它。

随着append方法,可以将数据添加到缓冲区:

String[] values = { 'string value', 'testing' }; 
StringBuffer sb = new StringBuffer(); 
for(String value: values) { 
    sb.append(value); 
} 

会导致 - >string valuetesting

注:这可能是更好的考虑,而不是StringBuilder

1

使用StringBuilder时,小字符串附加和连接通常看不到很多收益,但请记住,字符串附加操作有3个操作,1个新的分配由所添加的两个字符串的大小组成,以及2个复制操作复制内容(这意味着您现在在内存中有3个字符串),使用StringBuilder您只需追加并调整大小为一个固定宽度的缓冲区,这个缓冲区大部分时间只需要复制一次(摊余成本复制,有时您需要调整大小,需要2 )。如果您将很多内容添加到1个字符串中,我建议您使用StringBuilder来代替,但对于像您这样的共同作用,您不应该看到性能损失(至少可以衡量)。

1

使用StringBufferStringBuilder的想法是为了避免串 的重复串联如下显示:

String result = ""; 
for (int i = 0; i < 200; i++) { 
    result = result + i + ","; 
} 

这是效率不高,在每个环路中的一个字符串对象是(java的内部)产生

使用的StringBuilder/StringBuffer的:

StringBuilder buf = new StringBuilder(200); // init with a estimation of length has advantage 
for (int i = 0; i < 200; i++) { 
    buf.append(i).append(","); 
} 
String result = buf.toString(); 

这避免了不必要的创作在每个循环的字符串,它只是填补了字符缓冲区,并根据需要调整缓冲。

但在你的情况下,这是不值得的努力。

2

你可能想是这样的:

public static void winner() 
    { 
     StringBuffer sb = new StringBuffer("THE WINNER IS "); 

     if (position1 >= 100) 
      System.out.println(sb.append(name1).toString()); 
     else if (position2 >= 100) 
      System.out.println(sb.append(name2).toString()); 
    } 

,但一般的StringBuilder最好的StringBuffer作为访问的StringBuffer是同步的。

+0

感谢toString()做了什么? – user1965081

+0

在这里实际上并不是必须的,我只是为了代码清晰,所以你可以看看javadoc来看看StringBuffer(http://bit.ly/UWKIwq)中的.toString()是如何被覆盖的。 System.out.println(foo)实际上会调用String.valueOf(foo),它反过来调用foo.toString(),所以你*可以*实际上只是做System.out.println(sb.append(name1));和System.out.println(sb.append(name2));在每一行上:) – phippsnatch

0

是的,你可以。就像所有人指出的那样,StringBuffer.toString()将以String形式清除内容。你需要问自己的问题是,你真的关心你使用什么,或者你真的想使用StringBuffer来学习一些东西。

对于您的操作,一个和另一个一样好。如果你真的想做你的朋友告诉你的东西,我想这里的人已经清楚地回答了。

或者你可以告诉你的朋友,“没关系,一个是与其他在我的情况一样好” :)

0

为了得到同步串的版本,建议使用StringBuffer的地方线程安全的高要求。对于非同步使用的StringBuilder类,不需要线程安全性,我们的应用程序将会提供更好的性能。

相关问题