zoukankan      html  css  js  c++  java
  • StringBuffer

    1.StringBuffer

                  StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。

                 在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。

                 另外由于StringBuffer是线程安全的。即全局范围的StringBuffer和StringBuilder,两个线程不能同时修改StringBuffer中的内容,而能同时修改StringBuilder中的东西。比如说一个StringBuffer对象,一个线程调用StringBuffer.append("a"),另一个线程调用StringBuffer.append("b"),那它的数据肯定包含"a",和"b"这两个字符。但同样的操作对StringBuilder来说,最终的结果是,数据可能只有"a",也可能只有"b"或同时有"a“也有”b",这是不确定的

    1.1初始化

         StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造法进行初始化。

    例如:

             StringBuffer s = new StringBuffer();

             StringBuffer s = new StringBuffer(“abc”);


       StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:

             StringBuffer s = “abc”;               //赋值类型不匹配

             StringBuffer s = (StringBuffer)”abc”;    //不存在继承关系,无法进行强转

       StringBuffer对象和String对象之间的互转的代码如下:

             String s = “abc”;

             StringBuffer sb1 = new StringBuffer(“123”);

             StringBuffer sb2 = new StringBuffer(s);   //String转换为StringBuffer

             String s1 = sb1.toString();              //StringBuffer转换为String

    1.2常用方法

         StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。

    a、append方法 

         public StringBuffer append(boolean b)

    该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:

                      StringBuffer sb = new StringBuffer(“abc”);

                      sb.append(true);

             则对象sb的值将变成”abctrue”。

    使用该方法进行字符串的连接,将比String更加节约内容,例如应用于数据库SQL语句的连接,例如:

                       StringBuffer sb = new StringBuffer();

                       String user = “test”;

                       String pwd = “123”;

                       sb.append(“select * from userInfo where username=“)

                        .append(user)

                        .append(“ and pwd=”)

                        .append(pwd);

             这样对象sb的值就是字符串“select * from userInfo where username=test and pwd=123”。

    b、deleteCharAt方法

             public StringBuffer deleteCharAt(int index)

    该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:

             StringBuffer sb = new StringBuffer(“Test”);

             sb. deleteCharAt(1);

             public StringBuffer delete(int start,int end)

    该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:

             StringBuffer sb = new StringBuffer(“TestString”);

             sb. delete (1,4);//[1,3]

     该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。

       c、insert方法

                                public StringBuffer insert(int offset, boolean b)

               该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:

                                         StringBuffer sb = new StringBuffer(“TestString”);

                                         sb.insert(4,false);

         该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。

        d.reverse方法

                                public StringBuffer reverse()

    该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:

             StringBuffer sb = new StringBuffer(“abc”);

             sb.reverse();

    经过反转以后,对象sb中的内容将变为”cba”。

       e.setCharAt方法

                                public void setCharAt(int index, char ch)

                                该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:

                                         StringBuffer sb = new StringBuffer(“abc”);

                                         sb.setCharAt(1,’D’);

                                则对象sb的值将变成”aDc”。

         f、trimToSize方法

                                public void trimToSize()

    该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。

             总之,在实际使用时,String和StringBuffer各有优势和不足,可以根据具体的使用环境,选择对应的类型进行使用。


    2.String,StringBuilder和StringBuffer的区别

       1. String 类 
         String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。
            String a = "a"; //假设a指向地址0x0001 
           a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向了其它地址。 因此String的操作都是改变赋值地址而不是改变值操作。

          2. StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。

            StringBuffer buf=new StringBuffer(16); //分配长16字节的字符缓冲区 
           StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区 
           StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。

        3.StringBuffer
      StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。对于经常要改变值的字符串应该使用StringBuffer和StringBuilder类。

        4.线程安全 
         StringBuffer 线程安全 
         StringBuilder 线程不安全

    5.速度
    一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。

    6.总结
    (1).如果要操作少量的数据用 = String
    (2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
    (3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer





  • 相关阅读:
    论 mysql 主键
    详解 hibernate 悲观锁 乐观锁 深入分析 代码实例
    Mysql 如何 删除大表
    JSP 不能用 不支持 STRUTS标签 报错 The Struts dispatcher cannot be found.
    struts2 防止重复提交 实例代码
    ECLIPSE MYECLIPSE 在线安装SVN
    powerdesigner中给一主键设为自增型auto_increment
    GDAL计算栅格图像统计值相关说明
    GDAL使用DEM数据计算坡度坡向
    到底什么是I/O Port,什么是Memorymapped I/O
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5392974.html
Copyright © 2011-2022 走看看