4

我正在做一个计算机科学项目,我需要合并StringBuffers. 我需要帮助.append了解连接的含义和含义。有人告诉我,我可以通过使用.appendwith来显示谁是(我的游戏的)赢家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我可以用来输出谁赢得了比赛,而不是将名称作为字符串?

4

7 回答 7

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

在您的情况下,他们可能正在谈论为两种情况预初始化单个 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);
}
于 2013-01-11T22:51:28.057 回答
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 的访问是同步的。

于 2013-01-11T22:57:41.010 回答
1

您可以,因为System.out.println会自动将其参数转换为 a String,从而产生StringBuffer. 大多数情况下,您会在需要迭代一组数据时使用它。

使用该append方法,您可以将数据附加到缓冲区:

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

将导致 -->string valuetesting

注意:改为考虑可能会更好StringBuilder

于 2013-01-11T22:46:45.867 回答
1

小字符串追加和连接通常不会从使用中获得太多好处,StringBuilder但请记住,字符串追加有 3 个操作,1 个新分配,包括添加的两个字符串的大小,以及 2 个复制操作来复制内容(这意味着您现在在内存中有 3 个字符串),StringBuilder您只需附加并调整大小到一个固定宽度的缓冲区,大部分时间只需要 1 个副本(摊销成本副本,有时您需要调整大小,需要 2 个)。如果您将很多内容附加到 1 个字符串中,我建议您StringBuilder改用,但对于像您这样的连接,您不应该看到性能损失(至少可测量)。

于 2013-01-11T22:48:59.583 回答
1

使用StringBufferor的想法StringBuilder是避免重复连接字符串,如下所示:

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

这效率不高,在每个循环中(在内部)创建一个 String 对象

使用 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();

这避免了在每个循环中不必要地创建字符串,它只是用字符填充缓冲区,并在需要时调整缓冲区的大小。

但是,在您的情况下,这不值得付出努力。

于 2013-01-11T22:53:29.290 回答
0

是的你可以。就像每个人都指出的那样, StringBuffer.toString() 会将内容作为字符串刷新。你需要问自己的问题是,你真的关心你使用什么,还是你特别想使用 StringBuffer 来学习一些东西。

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

或者你可以告诉你的朋友,“没关系。在我的情况下,一个和另一个一样好”:)

于 2013-01-11T23:21:23.160 回答
0

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

于 2016-09-25T08:40:58.183 回答