美文网首页
字符串(2)-StringBuffer与StringBuilde

字符串(2)-StringBuffer与StringBuilde

作者: 炖土豆块 | 来源:发表于2019-04-28 16:32 被阅读0次

1.StringBuffer
1)StringBuffer:线程不安全,也是对字符串的操作,位于java.lang包中,其底层也是字符数组,初始化长度是16;但是它在String类的基础上有了很大的改进,最大的特点就是String是不可变。的,StringBuffer是可变化的。
2)常用方法
增加:
在字符串后附加,参数可以是任意基本数据类型,boolean会被转为"true"或者"false"等
public StringBuffer append(Object obj);
public StringBuffer append(String str);
public StringBuffer append(double d) ;
在指定位置后增加字符串,参数可以是任意基本数据类型,boolean会被转为"true"或者"false"等
public StringBuffer insert(int offset, boolean b);
public StringBuffer insert(String str);
public StringBuffer insert(double d) ;
删除:
public StringBuffer deleteCharAt(int index) :删除指定位置的字符
public StringBuffer delete(int start, int end):删除指定位置到指定位置的字符串
修改:
public StringBuffer replace(int start, int end, String str):将指定位置的字符串(start到end位置的)替换为str
反转:
public synchronized StringBuffer reverse() :将字符串反转返回。
3)String与StringBuffer:
<1>String是字符串常量,是不变的,在改动String时候实际上是又新建了一个String对象;而StringBuffer是可变的,在改动的时候是先保存了原先对象的地址,然后将改动后的对象放在原地址上的。

    //以对字符串的增加为例
        String s1 = "ad";
        System.out.println(s1.hashCode());//3107
        s1+="sd";
        System.out.println(s1.hashCode());//2989492

        StringBuffer sb2 = new StringBuffer("ss");
        System.out.println(sb2.hashCode());//460141958
        sb2.append("as");
        System.out.println(sb2.hashCode());//460141958

从结果上可以发现,String的地址发生了改变,StringBuffer的地址没有发生改变。
<2>在使用字符串进行增删改查操作时候,由于String将会新建对象后然后引用,这样大大影响了性能,而StringBuffer是在原来的对象上修改的所以不存在这样的影响。当数据量巨大时候,String将会造成大量的对象的创建,而StringBuffer则是始终只有一个对象。

String s1 = "sadfge";
        String str1 = new String("sadgfe");
        StringBuffer sb1 = new StringBuffer("sadfge");
        long a1 = System.currentTimeMillis();
        for(int i = 0;i<10000;i++){
            s1+="sadfge";
        }
        long a2 = System.currentTimeMillis();
        System.out.println(a2-a1);//501

        long a3 = System.currentTimeMillis();
        for(int i = 0;i<10000;i++){
            sb1.append("sadfge");
        }
        long a4 = System.currentTimeMillis();
        System.out.println(a4-a3);//0

从结果上可以看到在处理大数据量时候的明显差距。
2.StringBuilder
StringBuilder是5.0新增的,是线程不安全的,其大部分方法与StringBuffer是一致的。
3.总结
1)对于数据量小的使用String;
2)数据量大且要求线程安全的使用StringBuffer;
3)数据量大且并无线程安全要求的使用StringBuilder。

相关文章

网友评论

      本文标题:字符串(2)-StringBuffer与StringBuilde

      本文链接:https://www.haomeiwen.com/subject/jfodnqtx.html