美文网首页
StringBuild的高性能场景下的使用

StringBuild的高性能场景下的使用

作者: 何何与呵呵呵 | 来源:发表于2020-04-01 09:56 被阅读0次
StringBuilder与StringBuffer

一个线程不安全一个线程安全.但StringBuilder效率更高.

如何高性能场景下使用StringBuilder

首先,我们得了解StringBuilder存在的两个问题,线程不安全以及char[]重复扩容的影响.
new StringBuilder() 时char[]的默认长度是16,然后,如果要append第17个字符,怎么办?用System.arraycopy成倍复制扩容!这样一来有数组拷贝的成本,二来原来的char[]也白白浪费了要被GC掉。可以想见,一个129字符长度的字符串,经过了16,32,64, 128四次的复制和丢弃,合共申请了496字符的数组,在高性能场景下,这几乎不能忍。

如何解决(参考jdk的BigDecimal类)

BigDecimal里面有这么两段代码
1.通过ThreadLocal封装StringBuilderHelper

private static final ThreadLocal<StringBuilderHelper>
        threadLocalStringBuilderHelper = new ThreadLocal<StringBuilderHelper>() {
        @Override
        protected StringBuilderHelper initialValue() {
            return new StringBuilderHelper();
        }
    };

2.StringBuilderHelper的主要定义

static class StringBuilderHelper {
        final StringBuilder sb;    // Placeholder for BigDecimal string
        final char[] cmpCharArray; // character array to place the intCompact

        StringBuilderHelper() {
            sb = new StringBuilder();
            // All non negative longs can be made to fit into 19 character array.
            cmpCharArray = new char[19];
        }

        // Accessors.
        StringBuilder getStringBuilder() {
            sb.setLength(0);
            return sb;
        }
    }

ThreadLocal的使用解决了StringBuilder的并发不安全问题.
StringBuilder.setLength()函数重置它的count指针,而char[]则会继续重用,而toString()时会把当前的count指针也作为参数传给String的构造函数,所以不用担心把超过新内容大小的旧内容也传进去了。
cmpCharArray = new char[19]指定大小,包含最大long值.

相关文章

  • StringBuild的高性能场景下的使用

    StringBuilder与StringBuffer 一个线程不安全一个线程安全.但StringBuilder效率...

  • 字符串

    1 .Encode and Decode Strings(271.leetcode) 使用 StringBuild...

  • 写sql的tip

    hibernate可以使用stringbuild去拼接sql语句,如果使用string去拼接,会造成很多多余的对象...

  • Java 基础 之 String

    在Java中字符串的使用非常广泛,我们常用的如:String ,StringBuffer, StringBuild...

  • 实现特定场景下高性能的HashMap

    C++标准库的某些场景下的效率问题 在下面的场景中,C++标准库的unordered_map、map、multis...

  • Q-02-22

    this super StringBuild

  • CopyOnWriteArrayList学习

    CopyOnWriteArrayList适用场景:在读多写少的场景下能显著提高性能,并且它是线程安全的。主要原理直...

  • 分布式流式计算-Kafka部署

    Kafka是一个高性能的流式消息队列,适用于大数据场景下的消息传输、消息处理和消息存储。在学习过程中,我们通常使用...

  • EHPC工业仿真

    场景描述 本实践适用于使用弹性高性能计算EHPC+ 对象存储OSS运行仿真软件进行模型仿真 的场景中,这里运行的是...

  • Block场景下的weak使用

    在讲解正文之前,先说一个block修饰符为copy的缘由。在苹果官方文档中有官方示例,如下所示: @interfa...

网友评论

      本文标题:StringBuild的高性能场景下的使用

      本文链接:https://www.haomeiwen.com/subject/lafouhtx.html