JAVA基础知识回顾-----StringBuffer详解-----随想随写
StringBuffer
①StringBuffer的内容是可变的,在对StringBuffer的内容进行修改时,他
不会产生新的对象,只是在原来的基础上进行修改;
②StringBuffer是线程安全的,同步,效率相对StringBuild来说比较低
③继承了AbstractStringBuilder类
③StringBuffer类里的常用方法解析(按字母排序):
a)方法一:构造方法
ep1:
public StringBuffer() { super(16); } ep2: public StringBuffer(int capacity) { super(capacity); }
ep3:
public StringBuffer(String str) { super(str.length() + 16); append(str); }
作用:构造方法,创建StringBuffer对象,它不能直接像String那样
(比如:String s="Hello";)直接赋值,它需要经过构造方法来对一个
对象进行赋值;
解释:
ep1:StringBuffer sb1=new StringBuffer();会为对象保留16个字符的扩展空间 ep2: StringBuffer sb2=new StringBuffer(24);创建容量大小为24个字符的对象 ep3:StringBuffer sb3=new StringBuffer("hello");根据String对象创建一个 StringBuffer对象,并会为这个对象额外的保留16个字符空间;
b)方法二:public synchronized StringBuffer append(String str)
//StringBuffer中 public synchronized StringBuffer append(String str) { super.append(str); return this; } //AbstractStringBuffer中 public AbstractStringBuilder append(String str) { if (str == null) str = "null"; int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value, count); count += len; return this; }
作用:这是StringBuffer的核心方法,字符串进行拼接时,采用append方法并不会
创建一个新的StringBuffer的对象;
解释:如果追加的数据为一个null,则直接在源对象后面追加null即可;
如果不为空,则先扩大容量,然后改变源对象的值,最后改变源对象的大小
(这个大小指调用length()方法后返回的值)
c)方法三:
//StringBuffer中 public synchronized StringBuffer insert(int offset, String str) { super.insert(offset, str); return this; } //AbstractStringBuffer中 public AbstractStringBuilder insert(int offset, String str) { if ((offset < 0) || (offset > length())) throw new StringIndexOutOfBoundsException(offset); if (str == null) str = "null"; int len = str.length(); ensureCapacityInternal(count + len); System.arraycopy(value, offset, value, offset + len, count - offset); str.getChars(value, offset); count += len; return this; }
作用:在指定位置(offset)插入字符串;
解释:先判断参数offset是否为合法下标,如果合法,则执行以下操作,否则,
抛出String下标越界异常(StringIndexOutOfBounsException);
再判断插入的是否为null,如果为null值,则将str="null",准备插入StringBuffer
对象中,如果不为空,则先扩大容量,再插入值,最后改大小,返回插入后的对象值;
④测试String和StringBuffer修改内容的效率
ep1: String tempstr = "abc"; int times = 5000; long lstart1=System.currentTimeMillis(); String str =""; for(int i=0;i<times;i++){ str+=tempstr; } long lend1=System.currentTimeMillis(); long time1 = (lend1-lstart1); System.out.println(time1); //结果:32 ep2: String tempstr = "abc"; int times = 5000; long lstart1=System.currentTimeMillis(); StringBuffer strBuffer =new StringBuffer(); for(int i=0;i<times;i++){ strBuffer.append(tempstr); } long lend1=System.currentTimeMillis(); long time1 = (lend1-lstart1); System.out.println(time1); } //结果:0