我正在做一个计算机科学项目,我需要合并StringBuffer
。我需要帮助.append
做什么以及连接意味着什么。有人告诉我,我可以通过.append
使用StringBuffer
来显示谁是我的游戏的赢家。
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
来输出赢得游戏的人吗?
答案 0 :(得分:7)
感谢编译器,您已经在使用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());
}
}
的更新版本。
上面的代码将编译为相当于:
StringBuilder
所以,在这种情况下,你不会完成任何尚未完成的事情。在循环中构建String
时使用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);
}
。
在您的情况下,他们可能正在讨论为两种情况预先初始化单个StringBuilder:
{{1}}
答案 1 :(得分:3)
您可能需要以下内容:
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的访问是同步的。
答案 2 :(得分: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
。
答案 3 :(得分:1)
小字符串追加和concats通常看不到使用StringBuilder
带来的好处,但请记住,字符串追加有3个操作,1个新的分配包括添加的两个字符串的大小,以及复制内容的2个复制操作(这意味着你现在在内存中有3个字符串),StringBuilder
只需追加并调整大小到固定宽度的缓冲区,大多数时候只需要1个拷贝(有时是分摊的成本复制,有时候是你需要调整大小,需要2)。如果你要在1个字符串中添加很多内容,我建议使用StringBuilder
,但对于像你这样的连接,你不应该看到性能损失(至少可以测量)。
答案 4 :(得分:1)
使用StringBuffer
或StringBuilder
的想法是避免重复串联字符串
如下所示:
String result = "";
for (int i = 0; i < 200; i++) {
result = result + i + ",";
}
这不高效,在每个循环中,一个String对象是(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();
这可以避免在每个循环中不必要地创建字符串,它只是用字符填充缓冲区,并在需要时调整缓冲区的大小。
但是在你的情况下,这是不值得的。
答案 5 :(得分:0)
是的,你可以。像所有人都指出的那样,StringBuffer.toString()会将内容清除为String。你需要问自己的问题是,你真的关心你使用的是什么,或者你是否特别想要使用StringBuffer来学习一些东西。
对于您的手术,一个与另一个一样好。如果你真的想做你朋友告诉你的事情,我想这里的人们已经清楚地回答了这个问题。
或者你可以告诉你的朋友,“没关系。在我的情况下,一个和其他人一样好”:)
答案 6 :(得分:0)
获取建议使用StringBuffer的同步版本的字符串,其中线程安全性很高。对于非同步使用StringBuilder类,其中不需要线程安全性,我们的应用程序将提供更好的性能..