欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA基础知识回顾-----StringBuffer详解-----随想随写

程序员文章站 2022-04-23 14:10:49
...

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

 

相关标签: StringBuffer