1. 程式人生 > 其它 >StringBuilder和StringBuffer的區別

StringBuilder和StringBuffer的區別

技術標籤:javaSE

package com.uncle.myutil.src.bufferandbuilder;

/**
 * 字串相關的類
 * 	java.lang包
 * 	String
 * 		Serializable,CharSequence,Comparable
 * 		非常特殊的類   可以像常量一樣建立物件
 * 		String str = "abc";
 * 		記憶體儲存   "abc"物件  char[]  value
 * 		String不可變特性	private final char[] value;
 * 		頻繁的修改其內容的時候   效能很不好
 *
 * 	StringBuffer
 * 	StringBuilder
 * 	1.所屬的包  java.lang包
 * 	2.繼承AbstractStringBuilder 間接繼承 Object
 * 		實現介面Serializable,CharSequence,Appendable
 * 		StringBuffer/StringBuilder沒有compareTo方法
 * 		StringBuffer/StringBuilder含有一個String沒有的方法 append();拼接
 * 	3.特性
 * 		可變字串   char[] value;  動態擴容
 * 	4.物件的構建
 * 		//無引數構造方法  構建一個預設長度16個空間的物件  char[]
 * 		StringBuilder builder = new StringBuilder();
 * 		//利用給定的引數 構建一個自定義長度空間的物件 char[]
 * 		StringBuilder builder = new StringBuilder(20);
 * 		//利用帶String引數的構造方法  預設陣列長度字串長度+16個
 * 		StringBuilder builder = new StringBuilder("abc");
 * 	5.StringBuilder中常用的方法
 * 		最主要的方法 append()  頻繁的拼接字串的時候使用此方法 提高效能
 * 		ensureCapacity(int minimumCapacity)  確保底層陣列容量夠用
 * 		capacity();//字串底層char[]的容量
 * 		length();//字串有效元素個數(長度)
 * 		setLength();//設定字串的有效元素個數
 * 		char = charAt(int index);
 * 		int = codePointAt(int index);
 * 		String = substring(int start [,int end]);
 * 			注意需要接受返回值 看見截取出來的新字串效果
 * 		StringBuilder = delete(int start [,int end]);
 * 			StringBuilder類中獨有的方法String類沒有
 * 			將start到end之間的字串刪掉  不用接受返回值就看到效果啦
 * 		StringBuilder = deleteCharAt(int index);
 * 			String類中沒有的方法
 * 			將給定index位置的某一個字元刪除掉啦
 * 		int = indexOf(String str [,int fromIndex]);
 * 		int = lastIndexOf(String str [,int fromIndex])
 * 			找尋給定的str在字串中第一次出現的索引位置  帶過載 則從某一個位置開始找
 * 		insert(int index,value);
 * 			將給定的value插入在index位置之上
 * 		replace(int start,int end,String str);
 * 			將start和end之間的部分替換成str
 * 			builder.replace(2,5,"zzt");
 * 		setCharAt(int index,char value);
 * 			將index位置的字元改成給定的value
 * 		toString()
 * 			將StringBuilder物件 構建成一個string物件 返回
 * 		trimToSize()
 * 			將陣列中無用的容量去掉  變成length長度的陣列
 *
 *1.StringBuilder類不一定需要   是為了避免String頻繁拼接修改字串資訊的時候才用的
 * 		底層陣列是可變的  提高了效能
 * 	2.常用方法
 * 		與String類不同的獨有方法
 * 		append()  insert()  delete()  deleteCharAt()  reverse()
 * 		與String類相同的方法
 * 		length() charAt() codePointAt() indexOf() lastIndexOf()
 * 		substring() replace()名字相同 用法不一致
 * 		不是很常用的方法
 * 		ensureCapacity() capacity() setLength() trimToSize(); setCharAt();
 * 	3.String家族筆試中經常容易考察的知識點
 * 		1.String所屬的包 繼承關係 實現介面
 * 			java.lang 繼承Object 介面Serializable,CharSequence,Comparable
 * 		2.String構建方式
 * 			常量  構造方法
 * 		3.String物件記憶體結構
 * 			字串常量區  new堆記憶體物件
 * 			==  equals()區別
 * 			"a"+"b"+"c"
 * 		4.String不可變特性
 * 			長度及內容
 * 		5.String中的常用方法---與StringBuilder的區別
 * 			concat();  toUpperCase();
 * 		6.String和StringBuilder區別   |   String和StringBuffer區別
 * 			String不可變字串
 * 				JDK1.0
 * 				有一個介面Comparable
 * 				不可變體現在長度及內容
 * 				有一些方法StringBuilder沒有 concat  compareTo  toUpperCase
 * 			StringBuilder可變字串
 * 				JDK1.5
 * 				有一個介面Appendable
 * 				可變字串  沒有final修飾  底層可以進行陣列擴容
 * 				有一些方法String沒有  append() insert() delete() reverse()
 * 		7.StringBuffer和StringBuilder的不同
 * 			StringBuffer早期版本1.0
 * 			StringBuilder後來的版本1.5
 * 			早期版本  執行緒同步   	   安全性比較高  執行效率相對較低
 * 			後期版本  執行緒非同步    安全性比較低  執行效率相對較高
 *
 */
public class TestStringBuilder { public static void main(String[] args){ // //無引數構造方法 構建一個預設長度16個空間的物件 char[] // StringBuilder builder = new StringBuilder(); // //利用給定的引數 構建一個自定義長度空間的物件 char[] // StringBuilder builder = new StringBuilder(20); //利用帶String引數的構造方法 預設陣列長度字串長度+16個
//StringBuilder builder = new StringBuilder("abc"); // String str = "a"; // long time1 = System.currentTimeMillis(); // for(int i=1;i<=200000;i++){ // //str+="a";//利用+拼接 10030 // str = str.concat("a"); //5320 // } // long time2 = System.currentTimeMillis();
// System.out.println(time2-time1); // StringBuilder builder = new StringBuilder("a");//17 // long time1 = System.currentTimeMillis(); // for(int i=1;i<=200000;i++){ // builder = builder.append("a");//7毫秒 // } // long time2 = System.currentTimeMillis(); // System.out.println(time2-time1); // StringBuilder builder = new StringBuilder("abcdefg");//7+16 capacity // System.out.println(builder.capacity());//底層那個陣列的容量 // System.out.println(builder.length());//長度 有效元素的個數 // StringBuffer buffer = new StringBuffer(); // buffer.append(""); // // StringBuilder builder = new StringBuilder("abcdefg");// 7+16 // builder.append(""); // // System.out.println(builder.length());//7 // System.out.println(builder.capacity());//23 // builder.setLength(15);//length--15 // builder.trimToSize(); // System.out.println(builder.length());//15 // System.out.println(builder.capacity());//15 // System.out.println(builder.length());//7 // System.out.println(builder.capacity());//23 // builder.setLength(20); // System.out.println(builder.length());//20 // System.out.println(builder.capacity());//23 // builder.toString();//將一個StringBuilder物件 轉化成String物件 //builder.setCharAt(2,'z'); //System.out.println(builder); //builder.reverse(); //System.out.println(builder); // builder.replace(2,5,"zzt"); // System.out.println(builder); // builder.append("m");//abcdefgm // System.out.println(builder); // builder.insert(1,"n"); // System.out.println(builder); //builder.deleteCharAt(2); //System.out.println(builder); //builder.delete(2,5); //System.out.println(builder); // String value= builder.substring(2,5);//2索引開始5索引結束 // System.out.println(value); } }