StringBuilder和StringBuffer的區別
阿新 • • 發佈:2021-01-20
技術標籤: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);
}
}