String,StringBuilder,StringBuffer
概括
String:不可变的字符序列,底层使用char[]存储
StringBuffer:可变的字符序列,线程安全的,效率低,char[]存储
StringBuilder:可变的字符序列,jdk5.0新增,线程不安全,效率高,char[]存储
源码分析
String str = new String(); // char[] value = new char[0] String str = new String("abc"); // char[] value = new char[0]{'a','b','c'} StringBuffer sb = new StringBuffer(); //char[] value = new char[16]; sb.append("a"); //char[0]='a'; StringBuffer sb = new StringBuffer("abc"); //char[] value = new char["abc".length()+16];
StringBuilder和StringBuffer基本一样
扩容
如果添加的数据底层数组不够存,需要扩容,默认扩容到 原数组长度2倍+2,同时将原数组中的元素copy到新数组中
//需要扩容的时候,关键源码 int newCapacity = (value.length << 1) + 2;
编码建议
使用时预估字符长度,使用new StringBuilder(int capacity),new StringBuffer(int capacity)
StringBuffer线程安全
保证线程安全是通过方法使用synchronized关键字来实现的
StringBuffer,StringBuilder的常用方法
增:append(xxxx):字符串拼接
删:delete(int start,int end):删除指定位置的内容
改:replace(int start,int end,String str) :把[start,end)位置的字符串替换为str | void setCharAt(int n,char ch)
查:char charAt()
长度:int length()
插入:insert(int offset,xxx) 在指定位置插入xxx
遍历:for()+charAt() / toString()
其他:
reverse():字符序列逆转
int indexOf(String str)
String subString(int start,int end)
特别的 append()方法,如果参数是null值,会调用一个private的appendNull()的方法,也就是说实际添加的是"null"字符串,和String类似
public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value, count); count += len; return this; } private AbstractStringBuilder appendNull() { int c = count; ensureCapacityInternal(c + 4); final char[] value = this.value; value[c++] = 'n'; value[c++] = 'u'; value[c++] = 'l'; value[c++] = 'l'; count = c; return this; }