String和stringbuffer

 很多人都会认为,String和StringBuffer没有多大的区别,但是String与StringBuffer的区别,就是一个变量和常量的关系。
    StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值就是两个对象。
    StringBuffer 的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,使用StringBuffer要更加适合一些。
    在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的
    StringBuffer 类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符 比 String使用 + 操作符添加字符 到 一个已经存在的字符串后面有效率得多。
    因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这是一个非常消耗时间的操作。添加多个字符也 就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题。
    StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。


    下面就举一个例子来说明一下
   

    public static void main(String[] args) throws Exception{
        String str=new String();
        long start=System.currentTimeMillis();
        for(int i=0;i<50000;i++){
            str+=i+"";
        }
        long end=System.currentTimeMillis();
        System.out.println(end-start);
        StringBuffer strbuf=new StringBuffer();
        start=System.currentTimeMillis();
        for(int i=0;i<50000;i++){
            strbuf.append(i+"");
        }
        end=System.currentTimeMillis();
        System.out.println(end-start);
    }


    所用时间

9216
8

  这可以看出stringbuffer的速度

 但是,看上一个例子红色字体位置,我所用的string是每次添加不同的值,如果每次添加相同的值,因为栈内存中已经存在共享值,所以string不再创建新的内存,直接引用

    public static void main(String[] args) throws Exception{
        String str=new String();
        long start=System.currentTimeMillis();
        for(int i=0;i<50000;i++){
            str="abc";
        }
        long end=System.currentTimeMillis();
        System.out.println(end-start);
        StringBuffer strbuf=new StringBuffer();
        start=System.currentTimeMillis();
        for(int i=0;i<50000;i++){
            strbuf=new StringBuffer("abc");
        }
        end=System.currentTimeMillis();
        System.out.println(end-start);
    }
0
5

 这就是string的栈内存


    StringBuffer常用方法:
1. append(str); 添加
  StringBudder strBuf=new StringBuffer("a");
  strBuf.append("bcdefghi");
  结果:bcdefghi
2.deleteCharAt(int index); 删除第几个字节
  strBuf.append("abcdefghi");
  strBuf.deleteCharAt(0);
  结果:bcdefghi
3.delete(int start,int end);删除从第几个到第几个
  strBuf.append("abcdefghi");
  strBuf.delete(1,3);
  结果:adefghi
4.insert(int index,str);在什么位置添加什么内容
  strBuf.append("abcdefghi");
  strBuf.insert(1,"A");
  结果:aAdefghi
5.reverse()将字段反转
  strBuf.append("abc");
  strBuf.reverse();
  结果:cba
6.setCharAt(int index,char char) 修改字段
  注意 只能用char类型
  strBuf.append("abc");
  strBuf.setCharAt(1,‘B’);
  结果:aBc
7.trimToSize() 字符个数
  和size()相同 只不过这种可以节省空间

朱星翰

原文地址:https://www.cnblogs.com/yzssoft/p/7081681.html