String或StringBuffer

时间:2010-10-18 20:26:16

标签: java

private void doShareEmp(pageBean UTIL, HttpServletRequest request, String page)
        throws Exception
{
    doAction(request, UTIL, page);
    String action = pageBean.getSafeRequestOrNullParameter(request, "DO");
    long empRecNum = UTIL.getNumValue("EMPLOYEE", "REC_NUM");
    if (action != null)
    {
        if (action.startsWith("US:"))
            unshareEmployee(request, UTIL, action.substring(3));
        else if (action.equals("SHARE") && empRecNum != 0)
            shareEmployee(request, UTIL, empRecNum);
    }
    ListBean list = UTIL.getListBean(request, "EMPSHARELIST", true);
    if (empRecNum != 0)
    {
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT FLDREC_NUM, FLDCOMPANY, FLDLOCATION, FLDDEPT FROM @SCHEMAEMPLVIEW WHERE FLDEMPLOYEE = ? AND FLDTABLE='SHARED' ORDER BY FLDCOMPANY, FLDLOCATION, FLDDEPT");
        ArrayList qryParms = new ArrayList();
        qryParms.add(new Long(empRecNum));
        list.setQuery(UTIL, sql, qryParms);
    }
    else
        list.init();
}

在这段代码中,我将查询附加到StringBuffer。

哪一个更好?

  1. 字符串
  2. 的StringBuffer
  3. 的StringBuilder

6 个答案:

答案 0 :(得分:12)

StringBuilder是单线程环境中StringBuffer的替换,因为1.5,所以请使用StringBuilder。如果您在事后不打算对数据进行任何其他操作,请使用String

答案 1 :(得分:8)

仅在线程环境中需要

StringBuffer并且需要同步。似乎并非如此。

此外,您的字符串似乎是一劳永逸地定义的,简单的String就足够了。 当您通过附加内容修改“字符串”时,StringBuilder很有趣。如果您已拥有所有内容,则无需StringBuilder

但是你已经可以在他们的javadocs上阅读所有这些信息了:

  

StringBuilder类通常应优先于此类使用,因为它支持所有相同的操作,但速度更快,因为它不执行同步。

答案 2 :(得分:3)

字符串在Java中是不可变的,因此无论何时修改String对象,无论如何都要使用StringBuilder。如果String是不可变的,那么使用String,否则创建一个StringBuilder并在完成修改后将其转换为String。

答案 3 :(得分:1)

除非您每秒执行此方法(运行查询)数千次,否则请使用普通字符串。它是最易读,快速和紧凑的解决方案。

答案 4 :(得分:1)

你可能过于冗长。如果你的代码是

String sql = "SELECT COLUMNA,";
if(foo)
    sql += "COLUMNB"
else
    sql += "COLUMNC"

然后编译器实际上将优化并使用StringBuffer。

答案 5 :(得分:0)

你不应该浪费时间担心如何连接2个字符串。这不是一个伟大的程序员的标志,如果这是你的想法。

试试这个 - >

long finalTime1 = 0; {
long initialTimeTest = System.currentTimeMillis();
for(int index = 0; index< 10000; index ++){ StringBuilder sb = new StringBuilder(“Hello,”)。append(“World”); 的System.out.println(sb.toString()); }
finalTime1 = System.currentTimeMillis() - initialTimeTest;

}

long finalTime2 = 0; {
long initialTimeTest = System.currentTimeMillis();
for(int index = 0; index< 10000; index ++){ String sb =“Hello,”+“World”; System.out.println(sb); }
finalTime2 = System.currentTimeMillis() - initialTimeTest;
}

System.out.println(finalTime1); System.out.println(finalTime2);

结果:

... 你好,世界 你好,世界 245 148

您认为字符串缓冲区更快吗?

我们打破了所有规则的母亲:保持简单。 -

对于普通的字符串处理,没有理由使用StringBuilder。它只会给平凡的任务带来不必要的复杂性。

请,我们需要考虑BIG,考虑模块对项目的整体业务影响。讨论我们是否将使用StringBuilder或String组装两个字符串的想法很少, - 不要这样做。