`
xiaoZ5919
  • 浏览: 400177 次
  • 性别: Icon_minigender_1
  • 来自: 安平人@北京
博客专栏
Group-logo
Netty学习笔记
浏览量:72741
社区版块
存档分类
最新评论

StringBuffer与StringBuilder浅析

 
阅读更多

1. 为什么要用StringBuffer和StringBuilder?

 

String c = "aaa" +"bbb"与sb.append("aaa").append("bbb")有什么区别,类似这样的问题大家应该都很熟悉,它经常出现在面试题,我想答案大家都已经很清楚,用+会创建多个String,因为String是存放在常量池中的,而且是不可以变的,"aaa"变不成"aaabbb"。反过来问一下,都思考过StringBuffer或者StringBuilder到底怎么实现的?StringBuffer底层数据结构又是怎样的呢?带着这一番问题查看了StringBuffer的源码?

     StringBuffer和StringBuilder都是继承于AbstractStringBuilder,底层的逻辑都包含在这个类中。C中是没有字符串用char[]数组来实现字符串。StringBuffer底层也是char[],数组初始化的时候就定下了大小,如果不断的append肯定有超过数组大小的时候,我们是不是定义一个超大容量的数组,太浪费空间了。就像ArrayList的实现,采用动态扩展,每次append首先检查容量,容量不够就先扩展,然后复制原数组的内容到扩展以后的数组中,就这么简单,别无其他。

 public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        ensureCapacityInternal(count + len);//查看使用空间满足,不满足扩展空间
        str.getChars(0, len, value, count);//getChars就是利用native的array copy,性能高效
        count += len;
        return this;
    }

 

2. StringBuffer和StringBuilder区别?

StringBuffer的操作加上synchronized,而StringBuilder没有高效,如果我们在方法中声明并使用,就是局部变量,不会逃逸出这个方法体使用StringBuilder高效高一些。StringBuffer更适合并发访问的场景

3.如何高效的使用StringBuffer和StringBuilder?

如大概知道String的大小,尽量使用public StringBuffer(int capacity)指定容量,避免更少的动态扩展

 

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics