String類與StringBuffer類
一、String類和StringBuffer類的區別
String類是不可變類,新建的對象爲不可變對象(String類的內容和長度是固定的),一旦被創建就不能修改它的值(對於已經存在的String對象的修改都是重新創建一個新的對象,然後把新的值保存進去); String類是final類型不可被繼承。
StringBuffer類是可變類,新建的對象是一個可變的對象,當需要修改其內容的時候,不需要再創建新的字符串對象,而是直接操作原來的串;不能通過賦值符號對他進行賦值(只能通過構造函數來建立, StringBuffer sb = new StringBuffer(),每個StringBuffer對象都有一定的緩衝區容量,當字符串大小超過容量時,會自動增加容量);字符串連接操作中StringBuffer的效率要比String高。
另外由於StringBuffer是線程安全的,所以在多線程程序中也可以很方便的進行使用,但是程序的執行效率相對來說就要稍微慢一些。從JDK5開始,爲該類補充了一個單個線程使用的等價類,即StringBuilder。與該類相比,通常應該優先使用StringBuilder類,因爲它支持所有相同的操作,但由於它不支持同步,所以速度更快。
String 作爲參數傳遞是類似於基本數據類型作爲參數傳遞(值傳遞),StringBuffer 作爲參數傳遞就是引用數據類型傳遞。
總結一下:
相同點:
(1)String類與StringBuffer類都用來處理字符串。
(2)部分方法在二者中的用法是相同的。
(3)在這兩個類中,字符的索引都是從0開始的。
(4)這兩個類都是CharSequence的子類。CharSequence接口描述的是一系列字符集。
不同點:
(1)String類是不可變類,因爲在底端是用字符數組實現的,而數組長度固定,一旦賦值,就不能在原來的字符串上進行修改可能會浪費空間。StringBuffer類是可變類,能夠在原來的數組上進行修改。
(2)String類覆蓋了Object類的equals()方法,而StringBuffer類沒有覆蓋該方法。比較StringBuffer字符串內容是否相等,可以使用toString() 方法將StringBuffer的內容轉換爲String 字符串,再使用equals()方法比較。
(3)雖然兩個類都覆蓋了toString()方法,但各自的實現方式不同。String類的toString()方法返回當前String對象的引用。而StringBuffer類的toString()方法返回一個以當前StringBuffer的緩衝區的所有字符爲內容的新的String對象的引用。
(4)String類對象可以用操作符"+"進行連接,而StringBuffer類的對象通過append()方法添加新的字符串。
二、StringBuffer對象和String對象之間的互轉
String s = "abc"; StringBuffer sb1 = new StringBuffer("123"); StringBuffer sb2 = new StringBuffer(s); //String轉換爲StringBuffer String s1 = sb1.toString(); //StringBuffer轉換爲String |
三、StringBuffer類
1.StringBuffer的構造方法
public StringBuffer() 構造一個其中不帶字符的字符串緩衝區,其初始容量爲 16 個字符。
public StringBuffer(int capacity):指定容量大小
public StringBuffer(String str):構造一個字符串緩衝區:裏面的容量(字符串內容英文)大小:字符串長度+16初始容量
使用append()方法在字符串後面追加東西的時候,如果長度超過了該字符串存儲空間大小了就自動進行擴容:構建新的存儲空間更大的字符串,將舊的複製過去;
在進行字符串append添加的時候,會先計算添加後字符串大小,傳入一個方法:ensureCapacityInternal 這個方法進行是否擴容的判斷,需要擴容就調用expandCapacity方法進行擴容:嘗試將新容量擴爲大小變成2倍+2 ,判斷一下 容量如果不夠,直接擴充到需要的容量大小。
2.StringBuffer獲取功能
public int capacity():初始容量
public synchronized int length():返回字符串長度
3.StringBuffer的添加功能
StringBuffer append(xxx x):將指定的內容追加(末尾追加)到字符串緩衝區中,返回StringBuffer本身
public StringBuffer insert(int index,xxx x):在指定位置處,插入一個新的內容,返回StringBuffer本身
void setLength(int newLength) 重新設置字符串緩衝區中字符串的長度,如果newLength小於當前的字符串長度,將截去多餘的字符。
public void ensureCapacity (int minimumCapacity) 重新設置字符號串緩衝區的總空間。如果minimumCapacity大於當前的總空間,則新的空間被設置:一種結果是minimumCapacity;另一種結果是{"老空間"乘2加2}。
4.StringBuffer的刪除功能
StringBuffer deleteCharAt(int index) :刪除指定位置出的字符,返回字符串緩衝區本身
StringBuffer delete(int start, int end) :刪除從指定位置開始到指定位置結束,返回值字符串緩衝區本身
public void trimToSize()將StringBuffer對象的中存儲空間縮小到和字符串長度一樣的長度,減少空間的浪費。
5.StringBuffer的替換功能
public StringBuffer replace(int start,int end,String str):從指定位置開始到指定位置結束,用給定的str字符串替換指定的字符內容
public void setCharAt(int index, char ch):修改對象中索引值爲index位置的字符爲新的字符ch
6.StringBuffer的反轉功能
public StringBuffer reverse () 反轉功能
7.StringBuffer的截取功能
String substring(int start) :從指定位置默認截取到末尾,返回一個新的字符串
String substring(int start,int end):從指定位置開始截取到指定位置結束
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 從當前StringBuffer對象的索引號srcBegin開始,到srcEnd結束的子串,賦值到字符數組dst中,並且從dst的索引號dstBegin開始。
8. StringBuffer查找功能
int indexOf(String str) 返回當前StringBuffer對象中,第一個滿足str子串的位置。
int indexOf(String str, int fromIndex) 從當前StringBuffer對象的fromIndex開始查找,返回第一個滿足str子串的位置。
int lastIndexOf(String str) 返回當前StringBuffer對象中,最後一個滿足str子串的位置。
int lastIndexOf(String str, int fromIndex) 從當前StringBuffer對象的fromIndex開始查找,返回最後一個滿足str子串的位置。
四、String類方法(分類參考)
方法摘要 | |
char | charAt(int index) |
int | codePointAt(int index) |
int | codePointBefore(int index) |
int | codePointCount(int beginIndex, int endIndex) |
int | compareTo(String anotherString) |
int | compareToIgnoreCase(String str) |
String | concat(String str) |
boolean | contains(CharSequence s) |
boolean | contentEquals(CharSequence cs) |
boolean | contentEquals(StringBuffer sb) |
static String | copyValueOf(char[] data) |
static String | copyValueOf(char[] data, int offset, int count) |
boolean | endsWith(String suffix) |
boolean | equals(Object anObject) |
boolean | equalsIgnoreCase(String anotherString) |
static String | format(Locale l, String format, Object... args) |
static String | format(String format, Object... args) |
byte[] | getBytes() |
byte[] | getBytes(Charset charset) |
void | getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin) |
byte[] | getBytes(String charsetName) |
void | getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) |
int | hashCode() |
int | indexOf(int ch) |
int | indexOf(int ch, int fromIndex) |
int | indexOf(String str) |
int | indexOf(String str, int fromIndex) |
String | intern() |
boolean | isEmpty() |
int | lastIndexOf(int ch) |
int | lastIndexOf(int ch, int fromIndex) |
int | lastIndexOf(String str) |
int | lastIndexOf(String str, int fromIndex) |
int | length() |
boolean | matches(String regex) |
int | offsetByCodePoints(int index, int codePointOffset) |
boolean | regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) |
boolean | regionMatches(int toffset, String other, int ooffset, int len) |
String | replace(char oldChar, char newChar) |
String | replace(CharSequence target, CharSequence replacement) |
String | replaceAll(String regex, String replacement) |
String | replaceFirst(String regex, String replacement) |
String[] | split(String regex) |
String[] | split(String regex, int limit) |
boolean | startsWith(String prefix) |
boolean | startsWith(String prefix, int toffset) |
CharSequence | subSequence(int beginIndex, int endIndex) |
String | substring(int beginIndex) |
String | substring(int beginIndex, int endIndex) |
char[] | toCharArray() |
String | toLowerCase() |
String | toLowerCase(Locale locale) |
String | toString() |
String | toUpperCase() |
String | toUpperCase(Locale locale) |
String | trim() |
static String | valueOf(boolean b) |
static String | valueOf(char c) |
static String | valueOf(char[] data) |
static String | valueOf(char[] data, int offset, int count) |
static String | valueOf(double d) |
static String | valueOf(float f) |
static String | valueOf(int i) |
static String | valueOf(long l) |
static String | valueOf(Object obj) |