📜  Java中的StringBuffer类

📅  最后修改于: 2020-03-25 01:35:25             🧑  作者: Mango

Java中的字符串类
StringBufferString的对等类,它提供了许多字符串函数。String表示固定长度、不可变的字符序列,而StringBuffer表示可增长和可写的字符序列。
StringBuffer的字符和子字符串可以插入中间或附加到末尾。它会自动增长以为此类添加腾出空间,并且通常会预先分配比实际需要更多的字符,以留出增长空间。
StringBuffer构造函数:StringBuffer(): 它保留16个字符的空间,而无需重新分配。

StringBuffer s=new StringBuffer();

StringBuffer(int size)它接受一个整数参数,该参数显式设置缓冲区的大小。

StringBuffer s=new StringBuffer(20);

StringBuffer(String str): 它接受一个String参数,该参数设置StringBuffer对象的初始内容,并为另外16个字符保留空间而无需重新分配。

StringBuffer s=new StringBuffer("芒果文档");

方法
一些最常用的方法是:

  • length()和Capacity(): StringBuffer的长度可以通过length()方法找到,而总分配容量可以通过Capacity()方法找到。代码示例:
    import java.io.*;
    class GFG {
        public static void main(String[] args)
        {
            StringBuffer s = new StringBuffer("芒果文档");
            int p = s.length();
            int q = s.capacity();
            System.out.println("字符串长度 芒果文档=" + p);
            System.out.println("字符串分配容量 芒果文档=" + q);
        }
    }

    输出:

    字符串长度 芒果文档=4
    字符串分配容量 芒果文档=29
  • append(): 用于对存在文本的末尾添加文本。以下是其几种形式:
    StringBuffer append(String str)
    StringBuffer append(int num)

    代码 示例:

    import java.io.*;
    class GFG {
        public static void main(String[] args)
        {
            StringBuffer s = new StringBuffer("芒果");
            s.append("文档");
            System.out.println(s); // 返回 芒果文档
            s.append(1);
            System.out.println(s); // 返回 芒果文档1
        }
    }

    输出:

    芒果文档
    芒果文档1
  • insert(): 用于在指定的索引位置插入文本。这些是其几种形式:
    StringBuffer insert(int index,String str)
    StringBuffer insert(int index,char ch)

    在这里,index指定将字符串插入到调用StringBuffer对象的位置的索引。
    代码示例

    import java.io.*; 
    class GFG { 
        public static void main(String[] args) 
        { 
            StringBuffer s = new StringBuffer("GeeksGeeks"); 
            s.insert(5, "for"); 
            System.out.println(s); // 返回 GeeksforGeeks 
      
            s.insert(0, 5); 
            System.out.println(s); // 返回 5GeeksforGeeks 
      
            s.insert(3, true); 
            System.out.println(s); // 返回 5GetrueeksforGeeks 
      
            s.insert(5, 41.35d); 
            System.out.println(s); // 返回 5Getr41.35ueeksforGeeks 
      
            s.insert(8, 41.35f); 
            System.out.println(s); // 返回 5Getr41.41.3535ueeksforGeeks 
      
            char geeks_arr[] = { 'p', 'a', 'w', 'a', 'n' }; 
      
            // 在偏移量=9的地方插入字符 
            s.insert(2, geeks_arr); 
            System.out.println(s); // 返回 5Gpawanetr41.41.3535ueeksforGeeks 
        } 
    }


    输出:

    GeeksforGeeks
    5GeeksforGeeks
    5GetrueeksforGeeks
    5Getr41.35ueeksforGeeks
    5Getr41.41.3535ueeksforGeeks
    5Gpawanetr41.41.3535ueeksforGeeks
  • reverse(): 可以使用 reverse()反转StringBuffer对象中的字符此方法返回调用它的反转后的对象, 代码示例:
    import java.io.*;
    class GFG {
        public static void main(String[] args)
        {
            StringBuffer s = new StringBuffer("GeeksGeeks");
            s.reverse();
            System.out.println(s); // returns skeeGrofskeeG
        }
    }

    输出:

    skeeGskeeG

     

  • delete()和deleteCharAt() : 可以通过使用delete()deleteCharAt()方法删除一个StringBuffer内的字符. delete()方法从调用对象的字符序列删除。在这里,开始索引指定要删除的第一个字符的索引,结束索引指定要删除的最后一个字符的索引。因此,删除的子字符串从start Index到endIndex-1。返回结果StringBuffer对象。 deleteCharAt()方法同上,删除由指定的索引处的字符,它返回结果StringBuffer对象,这些方法如下所示:
    StringBuffer delete(int startIndex, int endIndex)
    StringBuffer deleteCharAt(int loc)

    代码示例:

    import java.io.*;
    class GFG {
        public static void main(String[] args)
        {
            StringBuffer s = new StringBuffer("GeeksforGeeks");
            s.delete(0, 5);
            System.out.println(s); // 返回 forGeeks
            s.deleteCharAt(7);
            System.out.println(s); // 返回 forGeek
        }
    }

    输出:

    forGeeks
    forGeek
  • replace(): 可以通过调用replace()在StringBuffer对象中用另一组字符替换一组字符。要替换的子字符串由索引start Index和endIndex指定。因此,从start index到endIndex-1的子字符串将被替换。替换字符串在str中传递,返回结果StringBuffer对象,其签名如下所示:
    StringBuffer replace(int startIndex, int endIndex, String str)

    代码示例:

    import Java.io.*;
    class GFG {
        public static void main(String[] args)
        {
            StringBuffer s = new StringBuffer("GeeksforGeeks");
            s.replace(5, 8, "are");
            System.out.println(s); // 返回 GeeksareGeeks
        }
    }

    输出:

    GeeksareGeeks
  • sureCapacity(): 用于增加StringBuffer对象的容量。新容量将被设置为我们指定的值,或者是当前容量的两倍加两个值(即容量+2),以较大者为准。此处,容量指定缓冲区的大小。
    void ensureCapacity(int capacity)

    除此之外,还可以使用String类中使用的所有方法。

  • StringBuffer appendCodePoint(int codePoint):此方法将codePoint参数的字符串表示形式附加到此序列。
    语法: 
    public StringBuffer appendCodePoint(int codePoint)
  • char charAt(int index):此方法按指定索引在此序列中返回char值。
    语法:
    public char charAt(int index)
  • IntStream chars():此方法返回此序列的int零扩展char值的流。
    语法:
    public IntStream chars()
  • int codePointAt(int index):此方法返回指定索引处的字符(Unicode  codePoint)。
    语法:
    public int codePointAt(int index)
  • int codePointBefore(int index):此方法返回指定索引之前的字符(Unicode  codePoint)。
    语法:
    public int codePointBefore(int index)
  • int codePointCount(int beginIndex,int endIndex):此方法返回此序列的指定文本范围内的Unicode代码点的数量。
    语法:
    public int codePointCount(int beginIndex,
                              int endIndex)
  • IntStream codePoints():此方法从该序列返回代码点值的流。
    语法:
    public IntStream codePoints()
  • void getChars(int srcBegin,int srcEnd,char [] dst,int dstBegin):在此方法中,将字符从此序列复制到目标字符数组dst中。
    语法:
    public void getChars(int srcBegin,
                         int srcEnd,
                         char[] dst,
                         int dstBegin)
  • int indexOf(String str):此方法返回指定子字符串首次出现在此字符串中的索引。
    语法:
    public int indexOf(String str)
    public int indexOf(String str,
                       int fromIndex)
  • int lastIndexOf(String str):此方法返回指定子字符串的最后一次出现在此字符串内的索引。
    语法:
    public int indexOf(String str)
    public int indexOf(String str,
                       int fromIndex)
  • int offsetByCodePoints(int index,int codePointOffset):此方法返回此序列内的索引,该索引相对于给定索引由codePointOffset代码点偏移。
    语法:
    public int offsetByCodePoints(int index,
                                  int codePointOffset)
  • void setCharAt(int index,char ch):在此方法中,指定索引处的字符设置为ch。
    语法:
    public int offsetByCodePoints(int index,
                                  int codePointOffset)
  • setLength(int newLength):此方法设置字符序列的长度。
    语法:
    public void setCharAt(int index,
                          char ch)
  • CharSequence subSequence(int start,int end):此方法返回一个新的字符序列,该字符序列是原序列的子序列。
    语法:
    public CharSequence subSequence(int start,
                                    int end)
  • String substring(int start):此方法返回一个新的String,该字符串包含此字符序列中当前包含字符的子序列。
    语法:
    public String substring(int start)
    public String substring(int start,
                            int end)
  • String toString():此方法返回一个表示此序列中数据的字符串。
    语法:
    public String toString()
  • void trimToSize():此方法尝试减少用于字符序列的存储。
    语法:
    public void trimToSize()

 一些有趣的事实:

  1. java.lang.StringBuffer扩展(或继承自)Object class
  1. StringBuffer类的所有已实现接口:Serializable,Appendable,CharSequence。
  1. 公共最终类StringBuffer扩展对象实现Serializable,CharSequence,Appendable
  1. 字符串缓冲区可安全用于多个线程。这些方法可以在任何必要的地方进行同步,以便对任何特定实例进行的所有操作都表现为以某种串行顺序进行。
  1. 每当发生涉及源序列的操作(例如从源序列追加或插入)时,此类仅在执行操作的字符串缓冲区上同步,而不在源上同步。
  1. 它从Object类继承了一些方法,这些方法是 clone,equals,finalize,getClass,hashCode,notify和notifyAll。

 StringBuilder:  J2SE 5向Java已经强大的字符串处理功能中添加了新的字符串类。这个新类称为StringBuilder。它与StringBuffer相同,除了一个重要的区别:它不同步,这意味着它不是线程安全的。StringBuilder的优点是性能更快。但是,在使用多线程的情况下,必须使用StringBuffer而不是StringBuilder。