加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java – 检查String大小的最快方法

发布时间:2020-12-14 05:06:16 所属栏目:Java 来源:网络整理
导读:我在循环语句中有以下代码. 在循环中,字符串被附加到sb(StringBuilder)并检查sb的大小是否已达到5MB. if (sb.toString().getBytes("UTF-8").length = 5242880) { // Do something} 这工作正常,但它很慢(在检查大小方面) 最快的方法是什么? 解决方法 您可以
我在循环语句中有以下代码.
在循环中,字符串被附加到sb(StringBuilder)并检查sb的大小是否已达到5MB.
if (sb.toString().getBytes("UTF-8").length >= 5242880) {
    // Do something
}

这工作正常,但它很慢(在检查大小方面)
最快的方法是什么?

解决方法

您可以使用快速计算UTF-8长度
public static int utf8Length(CharSequence cs) {
    return cs.codePoints()
        .map(cp -> cp<=0x7ff? cp<=0x7f? 1: 2: cp<=0xffff? 3: 4)
        .sum();
}

如果ASCII字符在内容中占主导地位,则使用起来可能会稍快一些

public static int utf8Length(CharSequence cs) {
    return cs.length()
         + cs.codePoints().filter(cp -> cp>0x7f).map(cp -> cp<=0x7ff? 1: 2).sum();
}

代替.

但是你也可以考虑不重新计算整个大小的优化潜力,而只考虑你附加到StringBuilder的新片段的大小,类似的东西

StringBuilder sb = new StringBuilder();
    int length = 0;
    for(…; …; …) {
        String s = … //calculateNextString();
        sb.append(s);
        length += utf8Length(s);
        if(length >= 5242880) {
            // Do something

            // in case you're flushing the data:
            sb.setLength(0);
            length = 0;
        }
    }

这假设如果你附加包含代理对的片段,它们总是完整的并且不会被分成两半.对于普通应用,情况应始终如此.

Didier-L建议的另一种可能性是推迟计算,直到你的StringBuilder达到阈值的长度除以3,如前所述,UTF-8长度不可能大于阈值.但是,如果碰巧在某些执行中没有达到阈值/ 3,那么这将是有益的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读