Java StringBuffer
 
 
  Java StringBuffer类用于创建可变(可修改)字符串。 Java中的StringBuffer类与String类相同,但它是可变的,即可以更改。
 
 
 
 
  注意:  Java StringBuffer类是线程安全的,即多个线程无法同时访问它。因此,这是安全的,将导致订单。 
 
  
 StringBuffer类的重要构造方法
 
 
 
   
   | 构造函数 | 说明 | 
 
   
   | StringBuffer() | 创建一个初始容量为16的空字符串缓冲区。 | 
 
   
   | StringBuffer(String str) | 用指定的字符串创建一个字符串缓冲区。 | 
 
   
   | StringBuffer(int capacity) | 创建一个具有指定容量作为长度的空字符串缓冲区。 | 
 
 
 
 StringBuffer类的重要方法
 
 
 
   
   | 修饰符和类型 | 方法 | 说明 | 
 
   
   | public synchronized StringBuffer | append(String s) | 用于在指定的字符串后附加此字符串。 append()方法已重载,如append(char),append(boolean),append(int),append(float),append(double)等。 | 
 
   
   | public synchronized StringBuffer | insert(int offset,String s) | 用于在此字符串的指定位置插入指定字符串。 insert()方法已重载,如insert(int,char),insert(int,boolean),insert(int,int),insert(int,float),insert(int,double)等。 | 
 
   
   | public synchronized StringBuffer | replace(int startIndex,int endIndex,String str) | 用于替换指定的startIndex和endIndex中的字符串。 | 
 
   
   | public synchronized StringBuffer | delete(int startIndex,int endIndex) | 用于从指定的startIndex和endIndex删除字符串。 | 
 
   
   | public synchronized StringBuffer | reverse() | 用于反转字符串。 | 
 
   
   | public int | capacity() | 用于返回当前容量。 | 
 
   
   | public void | ensureCapacity(int minimumCapacity) | 用于确保容量至少等于给定的最小值。 | 
 
   
   | public char | charAt(int index) | 用于返回指定位置的字符。 | 
 
   
   | public int | length() | 用于返回字符串的长度,即字符总数。 | 
 
   
   | public String | substring(int beginIndex) | 用于从指定的beginIndex返回子字符串。 | 
 
   
   | public String | substring(int beginIndex,int endIndex) | 用于从指定的beginIndex和endIndex返回子字符串。 | 
 
 
 
 
 
什么是可变字符串
 
 可以修改或更改的字符串称为可变字符串。 StringBuffer和StringBuilder类用于创建可变字符串。
 
 1)StringBuffer append()方法
 
  append()方法将给定参数与此字符串连接在一起。 
 
 
  
   class StringBufferExample{
     public static void main(String args[]){
         StringBuffer sb=new StringBuffer("Hello ");
         sb.append("Java");
         System.out.println(sb);
     }
 }
  
 
 
  
 2)StringBuffer insert()方法
 
  insert()方法将给定字符串与该字符串插入给定位置。
 
 
  
   class StringBufferExample2{
     public static void main(String args[]){
         StringBuffer sb=new StringBuffer("Hello ");
         sb.insert(1,"Java");
         System.out.println(sb);
     }
 }
  
 
 
  
 3)StringBuffer replace()方法
 
  replace()方法从指定的beginIndex和endIndex替换给定的字符串。
 
 
  
   class StringBufferExample3{
     public static void main(String args[]){
         StringBuffer sb=new StringBuffer("Hello");
         sb.replace(1,3,"Java");
         System.out.println(sb);
     }
 }
  
 
 
  
 4)StringBuffer delete()方法
 
  StringBuffer类的delete()方法将字符串从指定的beginIndex删除为endIndex。
 
 
  
   class StringBufferExample4{
     public static void main(String args[]){
         StringBuffer sb=new StringBuffer("Hello");
         sb.delete(1,3);
         System.out.println(sb);
     }
 }
  
 
 
  
 5)StringBuffer reverse()方法
 
  StringBuilder类的reverse()方法将当前字符串反向。
 
 
  
   class StringBufferExample5{
     public static void main(String args[]){
         StringBuffer sb=new StringBuffer("Hello");
         sb.reverse();
         System.out.println(sb);
     }
 }
  
 
 
  
 6)StringBuffer Capacity()方法
 
  StringBuffer类的Capacity()方法返回缓冲区的当前容量。缓冲区的默认容量为16。如果字符数从当前容量增加,它将增加(oldcapacity * 2)+2。例如,如果您当前的容量为16,则将为(16 * 2)+ 2 = 34。 
 
 
  
   class StringBufferExample6{
     public static void main(String args[]){
         StringBuffer sb=new StringBuffer();
         System.out.println(sb.capacity());
         sb.append("Hello");
         System.out.println(sb.capacity());
         sb.append("java is my favourite language");
         System.out.println(sb.capacity());
     }
 }
  
 
 
  
 7)StringBuffer sureCapacity()方法
 
  StringBuffer类的ensureCapacity()方法可确保给定容量为当前容量的最小值。如果大于当前容量,则将容量增加(oldcapacity * 2)+2。例如,如果您当前的容量为16,则将为(16 * 2)+ 2 = 34。 
 
 
  
   class StringBufferExample7{
     public static void main(String args[]){
         StringBuffer sb=new StringBuffer();
         System.out.println(sb.capacity());
         sb.append("Hello");
         System.out.println(sb.capacity());
         sb.append("java is my favourite language");
         System.out.println(sb.capacity());
         sb.ensureCapacity(10);
         System.out.println(sb.capacity());
         sb.ensureCapacity(50);
         System.out.println(sb.capacity());
     }
 }
  
 
 
  
 String和StringBuffer之间的区别
 
  String和StringBuffer之间有很多区别。下面列出了String和StringBuffer之间的差异: 
 
 
 
   
   | String | StringBuffer | 
 
   
   | String是不可变的。 | StringBuffer类是可变的。 | 
 
   
   | 当您连接太多字符串时,字符串速度很慢并且会占用更多内存,因为每次创建新实例时都如此。 | StringBuffer速度很快,并且在您可以分配字符串时消耗的内存更少。 | 
 
   
   | String重写Object类的equals()方法。因此,您可以通过equals()方法比较两个字符串的内容。 | StringBuffer类不会覆盖Object类的equals()方法。 | 
 
 
 
 
 
 
String和StringBuffer的性能测试
 
 
  
   public class ConcatTest{
     public static String concatWithString() {
         String t = "Java";
         for (int i=0; i<10000; i++){
             t = t + "Tpoint";
         }
         return t;
     }
     public static String concatWithStringBuffer(){
         StringBuffer sb = new StringBuffer("Java");
         for (int i=0; i<10000; i++){
             sb.append("Tpoint");
         }
         return sb.toString();
     }
     public static void main(String[] args){
         long startTime = System.currentTimeMillis();
         concatWithString();
         System.out.println("Time taken by Concating with String: "+(System.currentTimeMillis()-startTime)+"ms");
         startTime = System.currentTimeMillis();
         concatWithStringBuffer();
         System.out.println("Time taken by Concating with StringBuffer: "+(System.currentTimeMillis()-startTime)+"ms");
     }
 }
  
 
 
  
 
  
   Time taken by Concating with String: 578msTime taken by Concating with StringBuffer: 0ms
  
 
 
  
String和StringBuffer HashCode测试
 
 如下面的程序所示,当您连接字符串时,String返回新的哈希码值,但是StringBuffer返回相同的值。
 
 
  
   public class InstanceTest{
     public static void main(String args[]){
         System.out.println("Hashcode test of String:");
         String str="java";
         System.out.println(str.hashCode());
         str=str+"tpoint";
         System.out.println(str.hashCode());
         System.out.println("Hashcode test of StringBuffer:");
         StringBuffer sb=new StringBuffer("java");
         System.out.println(sb.hashCode());
         sb.append("tpoint");
         System.out.println(sb.hashCode());
     }
 }
  
 
 
  
 
  
   Hashcode test of String:3254818229541438Hashcode test of StringBuffer:118352462118352462