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

猜你喜欢

转载自ye-wolf.iteye.com/blog/2303175