String類的概述
JDK提供的API,查看String類的說明可以看到下面兩句話
字符串字面值"abc"也可以看成是一個字符串對象。
字符串是常量,一旦被賦值,就不能被改變。
String類的構造方法
方法 | 說明 |
---|---|
public String() | 空構造 |
public String(byte[] bytes) | 把字節數組轉成字符串 |
public String(byte[] bytes,int index,int length) | 把字節數組的一部分轉成字符串 |
public String(char[] value) | 把字符數組轉成字符串 |
public String(char[] value,int index,int count) | 把字符數組的一部分轉成字符串 |
public String(String original) | 把字符串常量值轉成字符串 |
String類的判斷功能
方法 | 說明 |
---|---|
boolean equals(Object obj) | 比較字符串的內容是否相同,區分大小寫 |
boolean equalsIgnoreCase(String str) | 比較字符串的內容是否相同,忽略大小寫 |
boolean contains(String str) | 判斷大字符串中是否包含小字符串 |
boolean startsWith(String str) | 判斷字符串是否以某個指定的字符串開頭 |
boolean endsWith(String str) | 判斷字符串是否以某個指定的字符串結尾 |
boolean isEmpty() | 判斷字符串是否為空。 |
String類的獲取功能
方法 | 說明 |
---|---|
int length() | 獲取字符串的長度。 |
char charAt(int index) | 獲取指定索引位置的字符 |
int indexOf(int ch) | 返回指定字符在此字符串中第一次出現處的索引。 |
int indexOf(String str) | 返回指定字符串在此字符串中第一次出現處的索引。 |
int indexOf(int ch,int fromIndex) | 返回指定字符在此字符串中從指定位置后第一次出現處的索引。 |
int indexOf(String str,int fromIndex) | 返回指定字符串在此字符串中從指定位置后第一次出現處的索引。 |
String substring(int start) | 從指定位置開始截取字符串,默認到末尾。 |
String substring(int start,int end) | 從指定位置開始到指定位置結束截取字符串。 |
String類的轉換功能
方法 | 說明 |
---|---|
byte[] getBytes() | 把字符串轉換為字節數組。 |
char[] toCharArray() | 把字符串轉換為字符數組。 |
static String valueOf(char[] chs) | 把字符數組轉成字符串。 |
static String valueOf(int i) | 把int類型的數據轉成字符串。 注意:String類的valueOf方法可以把任意類型的數據轉成字符串。 |
String toLowerCase() | 把字符串轉成小寫。(了解) |
String toUpperCase() | 把字符串轉成大寫。 |
String concat(String str) | 把字符串拼接。 |
String其他類型互轉匯總
其它類型轉成String類型
-
toString()
-
Object類中有public方法toString(),java對象都可以調用。注意:必須保證類對象不能為null值,否則拋出NullPointerException異常,派生類中一般覆蓋此方法。
-
(String)
-
強制類型轉換,需要保證能夠轉成String,前面使用instanceof進行檢查,否則拋出CalssCastException異常。注意:語法檢查時不會報錯,用時一定要小心。
-
valueOf(基本類型 i)
-
與第一種類似,只是前者不能為null,后者可以為null。
-
""+
-
效率上toString()>String.valueOf>i+””
String類型轉成其它類型
-
valueOf(String str)
-
可以把任意類型的數據轉成字符串
-
parseLong(String str)和parseInt(String str)
-
注:基本類型數據級別(byte/short/char)->int->long->float->double
低級別向高級別自動轉換;高級別向低級別強制轉換會導致溢出或丟失精度
附:基本類型與包裝類類型轉換
正向:Integeri=new Integer(100);
反向:int b=i.intValue();
特殊:int i=Integer.parseInt(“1234”);//可以通過
floatf=Float.valueOf("1234").floatValue();
charc=Character.valueOf(“1233”).charValue();
String、StringBuffer與StringBuilder之間區別
StringBuffer常用方法(StringBuilder的省略)
(由於StringBuffer和StringBuilder在使用上幾乎一樣,所以只寫一個)
構造方法
方法 | 說明 |
---|---|
publicStringBuffer() | 初始化出的StringBuffer對象是一個空的對象 |
publicStringBuffer(int capacity) | 分配了長度為capacity字節的字符緩沖區 |
publicStringBuffer(String str) | 創建帶有內容的StringBuffer對象 |
例子
StringBuffer s = new StringBuffer();
這樣初始化出的StringBuffer對象是一個空的對象
StringBuffer sb1=new StringBuffer(512);
分配了長度512字節的字符緩沖區。
StringBuffer sb2=new StringBuffer(“how are you?”)
創建帶有內容的StringBuffer對象,在字符緩沖區中存放字符串“how are you?”
常用方法
方法 | 說明 |
---|---|
StringBuffer append(boolean b) | 表示將括號里的某種數據類型的變量插入某一序列中 |
charAt( ) | 返回此序列中指定索引處的 char 值 |
getChars(int start,int end,char chars[],int charStart) | 將字符串的子字符串復制給數組 |
int length() | 返回長度(字符數)。 |
toString( ) | 返回此序列中數據的字符串表示形式。 |
subString( ) | 返回一個新的 String,它包含此序列當前所包含的字符子序列。 |
StringBuffer delete(int start,int end) | 刪除指定區間以內的所有字符,包含start,不包含end索引值的區間。 |
StringBuffer deleteCharAt(int index) | 刪除指定位置的字符,然后將剩余的內容形成新的字符串 |
StringBuffer insert(int offset, Object obj) | 該方法的作用是在StringBuffer對象中插入內容,然后形成新的字符串。 |
StringBuffer reverse() | 將StringBuffer對象中的內容反轉,然后形成新的字符串 |
void setCharAt(int index, char ch) | 修改對象中索引值為index位置的字符為新的字符ch |
void trimToSize() | 將StringBuffer對象的中存儲空間縮小到和字符串長度一樣的長度,減少空間的浪費,和String的trim()是一樣的作用。 |
執行速度比較
對字符串操作三者在執行速度方面的比較
StringBuilder > StringBuffer > String
String <(StringBuffer,StringBuilder)的原因
String:字符串常量
StringBuffer:字符創變量
StringBuilder:字符創變量
從上面的名字可以看到,String是“字符創常量”,也就是不可改變的對象。
String s = "abcd";
s = s+1;
System.out.print(s);// result : abcd1
JVM是這樣解析這段代碼的:首先創建對象s,賦予一個abcd,然后再創建一個新的對象s用來;執行第二行代碼,也就是說我們之前對象s並沒有變化,所以我們說String類型是不可改變的對象了,由於這種機制,每當用String操作字符串時,實際上是在不斷的創建新的對象,而原來的對象就會變為垃圾被GC回收掉,可想而知這樣執行效率會有多底。
而StringBuffer與StringBuilder就不一樣了,他們是字符串變量,是可改變的對象,每當我們用它們對字符串做操作時,實際上是在一個對象上操作的,這樣就不會像String一樣創建一些而外的對象進行操作了,當然速度就快了。
StringBuilder與 StringBuffer
StringBuilder:線程非安全的
StringBuffer:線程安全的
當我們在字符串緩沖去被多個線程使用是,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數情況下就是我們是在單線程下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。