文档章节

StringBuilder & StringBuffer

o
 ovirtKg
发布于 2017/02/21 17:31
字数 507
阅读 13
收藏 0

比较

StringBuffer与StringBuilder  都 继承于AbstractStringBuilder(ASB),唯一的区别就是StringBuffer的函数上都有synchronized关键字。

初始化长度

初始化长度 很重要。因为 ASB内部是使用了char[] 数组来存储字符串,默认大小是16,所以当大小超过时,会通过Arrays.copyof(src,count) 扩容。不仅消耗大,也浪费存储空间。所以应合理设置初始大小。

而且不管大小如何精确,toString也会浪费一倍的大小空间,

    @Override
    public synchronized String toString() {
        if (toStringCache == null) {
            toStringCache = Arrays.copyOfRange(value, 0, count);
        }
        return new String(toStringCache, true);
    }

String的构造函数会用 System.arraycopy()复制一把传入的char[]来保证安全性不可变性。

高性能优化

 Liferay的StringBundler类提供了另一个长度设置的思路,它在append()的时候,不急着往char[]里塞东西,而是先拿一个String[]把它们都存起来,到了最后才把所有String的length加起来,构造一个合理长度的StringBuilder。

重用StringBuilder(参数BigDecimal用法 )

BigDecimal 通过内部类SBhelper获得 可重用的sb,在get前需要count属性置0.而其中的char[] 得以重用。且不用担心 old的data 会影响到新的数据,因为toString如上 将count作为临界值。还有一点是用ThreadLocal用作修饰,线程安全,每个线程中仅有一份实例。

//BigDecimal   
 private static final ThreadLocal<StringBuilderHelper>
        threadLocalStringBuilderHelper = new ThreadLocal<StringBuilderHelper>() {
        @Override
        protected StringBuilderHelper initialValue() {
            return new 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); //仅仅将Conut属性置0
            return sb;
        }
        }

 

一般在高性能场景下。无法准备估计初始容量时,原生的实现可能会在拼接过程中多次扩容,且会申请远大于所需容易的空间,且扩容也会损耗资源。高性能的场景下,可以考虑使用   一个  ThreadLocal 可重用的StringBuilder。

 

 

Java StringBuilder 高性能用法总结

© 著作权归作者所有

共有 人打赏支持
o
粉丝 3
博文 57
码字总数 48798
作品 0
景德镇
私信 提问
String,StringBuilder,StringBuffer对比

简述 StringBuilder 对比 StringBuffer StringBuilder是非线程安全 StringBuffer是线程安全的。 StringBuilder和StringBuffer其余的特性都是一样的,他们与String的区别: StringBuilder与S...

Real_man
2018/03/20
0
0
java中String、StringBuffer、StringBuilder的区别 - jihite

java中String、StringBuffer、StringBuilder的区别 - jihite 博客园jihite2018-01-011 阅读 StringBufferjavaString Java里面提供了String,StringBuffer和StringBuilder三个类来封装字符串 ......

博客园_jihite
2018/01/01
0
0
java中StringBuffer、StringBulider、String的区别

String 类   String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。 String a = "a"; //假设a指向地址0x0001 a = "b";//...

帅的不像男的
2016/05/23
55
0
StringBuilder VS StringBuffer

问题 代码中的字符串拼接,又让我纠结了。到底该用StringBuilder,StringBuffer? 区别 is synchronized, is not. StringBuffer是同步的,StringBuilder是异步的。再看看文档: A mutable se...

亚林瓜子
2017/11/21
0
0
Java字符串的String、StringBuilder、StringBuffer三者特性详解

一、不可变String类型 字符串是计算机程序设计中的,最常见行为,Java的字符串操作最主要的类是String,并且String对象是不可变的(Immutable),即对象一旦创建在内存中,那么它的内容就不再...

断桥残雪断桥残雪
2015/08/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Prometheus简介

Prometheus是什么? Prometheus(普罗米修斯)是一套最初在SoundCloud上构建的开源监视和告警系统 。 特征 普罗米修斯的主要特点是: 具有由度量名称和键/值对标识的时间序列数据的多维数据模...

阿dai学长
20分钟前
0
0
“阿里巴巴小程序繁星计划”:20亿扶持200万小程序开发者和100万商家

3月21日,在2019阿里云峰会·北京站上,阿里巴巴旗下的阿里云、支付宝、淘宝、钉钉、高德等联合发布“阿里巴巴小程序繁星计划”:提供20亿元补贴,扶持200万+小程序开发者、100万+商家。凡入...

阿里云云栖社区
32分钟前
1
0
Android 动画Animation

动画分为视图动画(view animation)和属性动画(property animation),视图动画又分为帧动画和补间动画 视图动画控件(iv)点击事件(OnClickListener接口)触发位置在原位置 1.帧动画(Fra...

Coding缘
54分钟前
1
0
Mysql-常用日期查询

今天: SELECT * FROM A WHERE create_time = create_time(now()); 昨天: SELECT * FROM A WHERE TO_DAYS( NOW( ) ) - TO_DAYS( create_time) <= 1; 最近7天: SELECT * FROM A where DATE......

米饭有毒
56分钟前
2
0
如何离线分析Kafka海量业务消息?1分钟快速为您支招

场景介绍 说起Kafka,许多使用者对它是又爱又恨。Kafka是一种分布式的、基于发布/订阅的消息系统,其极致体验让人欲罢不能,但操心的运维、复杂的安全策略、可靠性易用性的缺失等,仍需要使用...

中间件小哥
58分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部