一、String、StringBuffer和StringBuilder比较
String:不可变的字符序列,jdk1.0,底层用final char[](不可变常量)
StringBuffer:可变的字符序列,jdk1.0,但是是线程安全的(它的所有方法都加了synchronized,如果多线程 且字符串刚好是共享数据就用buffer)所以效率比较低,底层用char[] (没有final可变)
StringBuilder:可变的字符序列,jdk5.0,线程不安全(和StringBuffer的方法一样但就是没加synchronized,不是多线程都用sringbuilder),效率高一点,底层用char[](没有final可变)
使用优先级:StringBuilder>StringBuffer>String
建议使用StringBuffer(int charCapaity)或者StringBuilder(int charCapaity),特别是字符串频繁变化的时候,选string效率很差每次都要新造一个。
二、可变性的原理
对于不可变的String来说
String str = new String();//char[] value = new char[0];
String str = new String("abc");//char[] value = new char[3];
对于可变的StringBuffer和StringBuilder:
StringBuffer str = new StringBuffer();//char[] value = new char[16]
str.append('a');//value[0] = 'a';
str.length();//1,因为有个count
StringBuffer str = new StringBuffer("abc");//char[] value = new char[3+16]
当长度不够要扩容的时候:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。默认情况下是原来容量的*2+2,再把原值复制到新数组中。(value.length<<1)+2
三、常用方法
首先很多StringBuffer和StringBuilder新增的方法基于可变性原理,会把原来的数组改变,并且有些甚至不返回值
StringBuffer append(xxx):用于字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容 [)
StringBuffer replace(int start,int end,String str)
StringBuffer insert(int offset,xxx)
StringBuffer reverse()
publiv int indexOf(String str)
public String substring(int start,int end)
public int length()
public cahr charAt(int n)
public void setCharAt(int n,char ch)
可以用增删改查来总结
增:append(xxx)
删:delete(int,int)
改:setCharAt(int,char)、replace(int,int,string)
查:charAt(int)
插:insert(int,string)
长度:length()