本文共 1112 字,大约阅读时间需要 3 分钟。
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)指定容量,避免更少的动态扩展
转载地址:http://vmdmi.baihongyu.com/