首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于最多9-10步字符串的连接,有没有比StringBuilder更快的方法?

对于最多9-10步字符串的连接,有没有比StringBuilder更快的方法?
EN

Stack Overflow用户
提问于 2010-05-26 04:32:24
回答 11查看 2K关注 0票数 6

我有这段代码来连接一些数组元素:

代码语言:javascript
复制
StringBuilder sb = new StringBuilder();
private RatedMessage joinMessage(int step, boolean isresult) {
        sb.delete(0, sb.length());
        RatedMessage rm;
        for (int i = 0; i <= step; i++) {
            if (mStack[i] == null)
                continue;
            rm = mStack[i].getCurrentMsg();// msg is built upfront, this just returns, it's a getter method call
            if (rm == null || rm.msg.length() == 0)
                continue;
            if (sb.length() != 0) {
                sb.append(", ");
            }
            sb.append(rm.msg);
        }
        rm.msg=sb.toString();
        return rm;
    }

重要的是,该数组最多可以容纳10个项目,所以它不是很多。

我的跟踪输出告诉我这个方法被调用了18864次,16%的运行时间都花在了这个方法上。我可以优化更多吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-05-26 04:51:08

一些想法:

1)您是否使用预估的最大容量初始化StringBuilder?这可以节省花费在内部数组重新分配和复制上的时间。

2)也许您可以在循环中附加一个结尾的逗号,并避免循环中的字符串长度条件。相反,应在方法的末尾添加一个条件,并根据需要删除尾随的逗号。

票数 3
EN

Stack Overflow用户

发布于 2010-05-26 04:40:29

首先,我不会重用StringBuilder,总是创建新的实例。这肯定会更快,因为它将允许GC使用年轻一代的堆区域。

另一个可以消除至少一个if语句的小技巧是重写代码,如下所示:

代码语言:javascript
复制
    String separator = "";
    for (int i = 0; i <= step; i++) {
        ...
        sb.append(separator);
        sb.append(rm.msg);
        separator = ", ";
    }
票数 5
EN

Stack Overflow用户

发布于 2010-05-26 04:44:36

您可以进行以下更改(仅显示差异):

代码语言:javascript
复制
    String separator = "";
    for (int i = 0; i <= step; i++) {
    // ...
        sb.append(separator).append(rm.msg);
        separator = ", ";
    }

如果额外的if重复9次,它就会被删除,代价是添加一次空字符串。在决定保留此更改之前,您应该衡量它是否对您正在使用的数据有任何帮助:-)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2908307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档