Java中字串的常用方法
阿新 • • 發佈:2019-02-17
1、equals():比較兩個字串是否相等
它具有如下的一般形式:boolean equals(Object str)
str是一個用來與呼叫字串(String)物件做比較的字串(String)物件。如果兩個字串具有相同的字元和長度,它返回true,否則返回false。這種比較是區分大小寫的。
2、equalsIgnoreCase( ):忽略大小寫的兩個字串是否相等比較
當比較兩個字串時,它會認為A-Z和a-z是一樣的。
其一般形式如下:boolean equalsIgnoreCase(String str)
str是一個用來與呼叫字串(String)物件做比較的字串(String)物件。如果兩個字串具有相同的字元和長度,它也返回true,否則返回false。
3、toString():轉換成String型別
Object object = getObject();
System.out.println(object.toString());
注意:必須保證object不是null值,否則將丟擲NullPointerException異常。
採用這種方法時,通常派生類會覆蓋Object裡的toString()方法。
4、String:轉換成String型別
(String)object:這是標準的型別轉換,將object轉成String型別的值。
注意:型別必須能轉成String型別。因此最好用instanceof做個型別檢查,以判斷是否可以轉換。否則容易丟擲CalssCastException異常。
因定義為Object 型別的物件在轉成String時語法檢查並不會報錯,這將可能導致潛在的錯誤存在。
如: Object obj = new Integer(100);
String strVal = (String)obj;
在執行時將會出錯,因為將Integer型別強制轉換為String型別,無法通過。
但是, Integer obj = new Integer(100);
String strVal = (String)obj;
如是格式程式碼,將會報語法錯誤。此外,因null值可以強制轉換為任何java類型別,(String)null也是合法的。
5、String.valueOf():轉換成String型別(不用擔心object是否為null值這一問題)
注意:當object為null 時,String.valueOf(object)的值是字串”null”,而不是null。
6、split():分隔符
1、如果用“.”作為分隔的話,必須是如下寫法,String.split("\\.")
2、如果用“|”作為分隔的話,必須是如下寫法,String.split("\\|")
“.”、“|”、"*" 和"+"都是轉義字元,必須得加"\\";
3、如果在一個字串中有多個分隔符,可以用“|”作為連字元,比如,“acount=? and uu =? or n=?”,把三個都分隔出來,可以用String.split("and|or");
例如:String[] aa = "aaa|bbb|ccc".split("\\*");
for (int i = 0 ; i <aa.length ; i++ ) {
System.out.println("--"+aa[i]);
}
7、subString():擷取字串中的一段字串
String str;
(1)str=str.substring(int beginIndex);
擷取掉str從首字母起長度為beginIndex的字串,將剩餘字串賦值給str;
(2)str=str.substring(int beginIndex,int endIndex);
擷取str中從beginIndex開始至endIndex結束時的字串,並將其賦值給str;
8、charAt():返回指定索引處char值
public char charAt(int index)
char s = str.charAt(1);
9、toLowerCase():將所有在此字串中的字元轉化為小寫(使用預設語言環境的規則)
public String toLowerCase()
String newStr = str.toLowerCase();
10、indexOf():指出 String 物件內子字串的開始位置
1、int indexOf(String str) :返回第一次出現的指定子字串在此字串中的索引。
2、int indexOf(String str, int startIndex):從指定的索引處開始,返回第一次出現的指定子字串在此字串中的索引。
3、int lastIndexOf(String str) :返回在此字串中最右邊出現的指定子字串的索引。
4、int lastIndexOf(String str, int startIndex) :從指定的索引處開始向後搜尋,返回在此字串中最後一次出現的指定子字串的索引。
注意:如果沒有找到子字串,則返回-1。
如果 startindex 是負數,則 startindex 被當作零。如果它比最大的字元位置索引還大,則它被當作最大的可能索引。
例如:String s = "xXccxxxXX";
// 從頭開始查詢是否存在指定的字元 //結果如下
System.out.println(s.indexOf("c")); //2
// 從第四個字元位置開始往後繼續查詢,包含當前位置
System.out.println(s.indexOf("c", 3)); //3
//若指定字串中沒有該字元則系統返回-1
System.out.println(s.indexOf("y")); //-1
System.out.println(s.lastIndexOf("x")); //6
11、replace和replaceAll
(1)replace的引數是char和CharSequence,即可以支援字元的替換,也支援字串的替換(CharSequence即字串序列的意思,說白了也就是字串);
(2)replaceAll的引數是regex,即基於規則表示式的替換,比如:可以通過replaceAll("\\d", "*")把一個字串所有的數字字元都換成星號;
相同點:都是全部替換,即把源字串中的某一字元或字串全部換成指定的字元或字串;
不同點:(1)replaceAll支援正則表示式,因此會對引數進行解析(兩個引數均是),如replaceAll("\\d", "*"),而replace則不會,replace("\\d","*")就是替換"\\d"的字串,而不會解析為正則。
(2)“\”在java中是一個轉義字元,所以需要用兩個代表一個。例如System.out.println( "\\" ) ;只打印出一個"\"。但是“\”也是正則表示式中的轉義字元,需要用兩個代表一個。所以:\\\\被java轉換成\\,\\又被正則表示式轉換成\,因此用replaceAll替換“\”為"\\",就要用replaceAll("\\\\","\\\\\\\\"),而replace則replace("\\","\\\\")。
(3)如果只想替換第一次出現的,可以使用replaceFirst(),這個方法也是基於規則表示式的替換,但與replaceAll()不同的是,只替換第一次出現的字串。
說到正則表示式,有個例子就能很好的解釋replaceAll的用法。即替換空格
String test = "wa n\tg_p\\te\\tn g";
test = test.replaceAll("\\t|\\\\t|\u0020|\\u3000", "");//去掉空格
System.out.println(test);
其中test = test.replaceAll("\\t|\\\\t|\u0020|\\u3000", "")
與test = Pattern.compile("\\t|\\\\t|\u0020|\\u3000").matcher(test).replaceAll("")
是等效的,
因此用正則表示式僅僅是替換全部或替換第一個的話,用replaceAll或replaceFirst即可。
12、getBytes():得到一個系統預設的編碼格式的位元組陣列
都是將一個string型別的字串轉換成byte型別並且存入一個byte陣列中。在java中的所有資料底層都是位元組,位元組資料可以存入到byte陣列。
UTF-8每個漢字轉成3bytes,而GBK轉成2bytes,所以要說明編碼方式,否則用預設編碼。
String.getBytes(String decode)
byte[] b_gbk = "中".getBytes("GBK");
byte[] b_utf8 = "中".getBytes("UTF-8");
byte[] b_iso88591 = "中".getBytes("ISO8859-1");
將分別返回"中"這個漢字在GBK、UTF-8和ISO8859-1編碼下的byte陣列表示,此時
b_gbk的長度為2,
b_utf8的長度為3,
b_iso88591的長度為1。
new String(byte[], decode)實際是使用指定的編碼decode來將byte[]解析成字串.
String s_gbk = new String(b_gbk,"GBK");
String s_utf8 = new String(b_utf8,"UTF-8");
String s_iso88591 = new String(b_iso88591,"ISO8859-1");
通過輸出s_gbk、s_utf8和s_iso88591,會發現s_gbk和s_utf8都是"中",而只有s_iso88591是一個不被識別的字元(可以理解為亂碼),為什麼使用ISO8859-1編碼再組合之後,無法還原"中"字?原因很簡單,因為ISO8859-1編碼的編碼表根本就不包含漢字字元,當然也就無法通過"中".getBytes("ISO8859-1");來得到正確的"中"字在ISO8859-1中的編碼值了,所以,再通過new String()來還原就更是無從談起。因此,通過String.getBytes(String decode)方法來得到byte[]時,一定要確定decode的編碼表中確實存在String表示的碼值,這樣得到的byte[]陣列才能正確被還原。
13、StringBuffer的append方法
StringBuffer buf=new StringBuffer("Hard ");
String aString = "Waxworks";
buf.append(aString,3,4);
原文說明:這個操作將aString的從索引位置3開始的由四個字元組成的子串追加到StringBuffer物件buf中。然後buf物件就會包含字元 串"Hard work"。
請注意,這個程式碼的實際執行結果是: buf物件包含的字串為"Hard w"。
具體原因引用原始碼:
public synchronized StringBuffer append(CharSequence s, int start, int end)
{
super.append(s, start, end);
return this;
}
根據執行結果分析,StringBuffer物件的append()方法的引數,如果是String型別,那麼,後面取子串的操作實際是從索引3開始,取值到索引4之前的串。如果append的語句改成 buf.append(aString,3,3); ,那麼沒有新增aString的子串,即 buf包含的字元實際還是"Hard "。如果此語句再改成 buf.append(aString3,2); ,那麼系統會丟擲"IndexOutOfBoundsException"的異常!
但是,如果append()的引數是字元陣列(char[]),那麼結果就如原文所述,buf將包含串"Hard work". 程式碼如下:
StringBuffer buf=new StringBuffer("Hard ");
char[] text ={'W','a','x','w','o','r','k','s'};
buf.append(text ,3,4); // buf包含串"Hard work"
具體原因引用原始碼:
public synchronized StringBuffer append(char str[], int offset, int len)
{
super.append(str, offset, len);
return this;
}
JAVA 中 Stringbuffer 有append()方法
Stringbuffer其實是動態字串陣列
append()是往動態字串陣列新增,跟“xxxx”+“yyyy”相當那個‘+’號
跟String不同的是Stringbuffer是放一起的
String1+String2 和Stringbuffer1.append("yyyy")雖然列印效果一樣,但在記憶體中表示卻不一樣
String1+String2 存在於不同的兩個地址記憶體
Stringbuffer1.append(Stringbuffer2)放再一起
它具有如下的一般形式:boolean equals(Object str)
str是一個用來與呼叫字串(String)物件做比較的字串(String)物件。如果兩個字串具有相同的字元和長度,它返回true,否則返回false。這種比較是區分大小寫的。
2、equalsIgnoreCase( ):忽略大小寫的兩個字串是否相等比較
當比較兩個字串時,它會認為A-Z和a-z是一樣的。
其一般形式如下:boolean equalsIgnoreCase(String str)
str是一個用來與呼叫字串(String)物件做比較的字串(String)物件。如果兩個字串具有相同的字元和長度,它也返回true,否則返回false。
3、toString():轉換成String型別
Object object = getObject();
System.out.println(object.toString());
注意:必須保證object不是null值,否則將丟擲NullPointerException異常。
採用這種方法時,通常派生類會覆蓋Object裡的toString()方法。
4、String:轉換成String型別
(String)object:這是標準的型別轉換,將object轉成String型別的值。
注意:型別必須能轉成String型別。因此最好用instanceof做個型別檢查,以判斷是否可以轉換。否則容易丟擲CalssCastException異常。
因定義為Object 型別的物件在轉成String時語法檢查並不會報錯,這將可能導致潛在的錯誤存在。
如: Object obj = new Integer(100);
String strVal = (String)obj;
在執行時將會出錯,因為將Integer型別強制轉換為String型別,無法通過。
但是, Integer obj = new Integer(100);
String strVal = (String)obj;
如是格式程式碼,將會報語法錯誤。此外,因null值可以強制轉換為任何java類型別,(String)null也是合法的。
5、String.valueOf():轉換成String型別(不用擔心object是否為null值這一問題)
注意:當object為null 時,String.valueOf(object)的值是字串”null”,而不是null。
6、split():分隔符
1、如果用“.”作為分隔的話,必須是如下寫法,String.split("\\.")
2、如果用“|”作為分隔的話,必須是如下寫法,String.split("\\|")
“.”、“|”、"*" 和"+"都是轉義字元,必須得加"\\";
3、如果在一個字串中有多個分隔符,可以用“|”作為連字元,比如,“acount=? and uu =? or n=?”,把三個都分隔出來,可以用String.split("and|or");
例如:String[] aa = "aaa|bbb|ccc".split("\\*");
for (int i = 0 ; i <aa.length ; i++ ) {
System.out.println("--"+aa[i]);
}
7、subString():擷取字串中的一段字串
String str;
(1)str=str.substring(int beginIndex);
擷取掉str從首字母起長度為beginIndex的字串,將剩餘字串賦值給str;
(2)str=str.substring(int beginIndex,int endIndex);
擷取str中從beginIndex開始至endIndex結束時的字串,並將其賦值給str;
8、charAt():返回指定索引處char值
public char charAt(int index)
char s = str.charAt(1);
9、toLowerCase():將所有在此字串中的字元轉化為小寫(使用預設語言環境的規則)
public String toLowerCase()
String newStr = str.toLowerCase();
10、indexOf():指出 String 物件內子字串的開始位置
1、int indexOf(String str) :返回第一次出現的指定子字串在此字串中的索引。
2、int indexOf(String str, int startIndex):從指定的索引處開始,返回第一次出現的指定子字串在此字串中的索引。
3、int lastIndexOf(String str) :返回在此字串中最右邊出現的指定子字串的索引。
4、int lastIndexOf(String str, int startIndex) :從指定的索引處開始向後搜尋,返回在此字串中最後一次出現的指定子字串的索引。
注意:如果沒有找到子字串,則返回-1。
如果 startindex 是負數,則 startindex 被當作零。如果它比最大的字元位置索引還大,則它被當作最大的可能索引。
例如:String s = "xXccxxxXX";
// 從頭開始查詢是否存在指定的字元 //結果如下
System.out.println(s.indexOf("c")); //2
// 從第四個字元位置開始往後繼續查詢,包含當前位置
System.out.println(s.indexOf("c", 3)); //3
//若指定字串中沒有該字元則系統返回-1
System.out.println(s.indexOf("y")); //-1
System.out.println(s.lastIndexOf("x")); //6
11、replace和replaceAll
(1)replace的引數是char和CharSequence,即可以支援字元的替換,也支援字串的替換(CharSequence即字串序列的意思,說白了也就是字串);
(2)replaceAll的引數是regex,即基於規則表示式的替換,比如:可以通過replaceAll("\\d", "*")把一個字串所有的數字字元都換成星號;
相同點:都是全部替換,即把源字串中的某一字元或字串全部換成指定的字元或字串;
不同點:(1)replaceAll支援正則表示式,因此會對引數進行解析(兩個引數均是),如replaceAll("\\d", "*"),而replace則不會,replace("\\d","*")就是替換"\\d"的字串,而不會解析為正則。
(2)“\”在java中是一個轉義字元,所以需要用兩個代表一個。例如System.out.println( "\\" ) ;只打印出一個"\"。但是“\”也是正則表示式中的轉義字元,需要用兩個代表一個。所以:\\\\被java轉換成\\,\\又被正則表示式轉換成\,因此用replaceAll替換“\”為"\\",就要用replaceAll("\\\\","\\\\\\\\"),而replace則replace("\\","\\\\")。
(3)如果只想替換第一次出現的,可以使用replaceFirst(),這個方法也是基於規則表示式的替換,但與replaceAll()不同的是,只替換第一次出現的字串。
說到正則表示式,有個例子就能很好的解釋replaceAll的用法。即替換空格
String test = "wa n\tg_p\\te\\tn g";
test = test.replaceAll("\\t|\\\\t|\u0020|\\u3000", "");//去掉空格
System.out.println(test);
其中test = test.replaceAll("\\t|\\\\t|\u0020|\\u3000", "")
與test = Pattern.compile("\\t|\\\\t|\u0020|\\u3000").matcher(test).replaceAll("")
是等效的,
因此用正則表示式僅僅是替換全部或替換第一個的話,用replaceAll或replaceFirst即可。
12、getBytes():得到一個系統預設的編碼格式的位元組陣列
都是將一個string型別的字串轉換成byte型別並且存入一個byte陣列中。在java中的所有資料底層都是位元組,位元組資料可以存入到byte陣列。
UTF-8每個漢字轉成3bytes,而GBK轉成2bytes,所以要說明編碼方式,否則用預設編碼。
String.getBytes(String decode)
byte[] b_gbk = "中".getBytes("GBK");
byte[] b_utf8 = "中".getBytes("UTF-8");
byte[] b_iso88591 = "中".getBytes("ISO8859-1");
將分別返回"中"這個漢字在GBK、UTF-8和ISO8859-1編碼下的byte陣列表示,此時
b_gbk的長度為2,
b_utf8的長度為3,
b_iso88591的長度為1。
new String(byte[], decode)實際是使用指定的編碼decode來將byte[]解析成字串.
String s_gbk = new String(b_gbk,"GBK");
String s_utf8 = new String(b_utf8,"UTF-8");
String s_iso88591 = new String(b_iso88591,"ISO8859-1");
通過輸出s_gbk、s_utf8和s_iso88591,會發現s_gbk和s_utf8都是"中",而只有s_iso88591是一個不被識別的字元(可以理解為亂碼),為什麼使用ISO8859-1編碼再組合之後,無法還原"中"字?原因很簡單,因為ISO8859-1編碼的編碼表根本就不包含漢字字元,當然也就無法通過"中".getBytes("ISO8859-1");來得到正確的"中"字在ISO8859-1中的編碼值了,所以,再通過new String()來還原就更是無從談起。因此,通過String.getBytes(String decode)方法來得到byte[]時,一定要確定decode的編碼表中確實存在String表示的碼值,這樣得到的byte[]陣列才能正確被還原。
13、StringBuffer的append方法
StringBuffer buf=new StringBuffer("Hard ");
String aString = "Waxworks";
buf.append(aString,3,4);
原文說明:這個操作將aString的從索引位置3開始的由四個字元組成的子串追加到StringBuffer物件buf中。然後buf物件就會包含字元 串"Hard work"。
請注意,這個程式碼的實際執行結果是: buf物件包含的字串為"Hard w"。
具體原因引用原始碼:
public synchronized StringBuffer append(CharSequence s, int start, int end)
{
super.append(s, start, end);
return this;
}
根據執行結果分析,StringBuffer物件的append()方法的引數,如果是String型別,那麼,後面取子串的操作實際是從索引3開始,取值到索引4之前的串。如果append的語句改成 buf.append(aString,3,3); ,那麼沒有新增aString的子串,即 buf包含的字元實際還是"Hard "。如果此語句再改成 buf.append(aString3,2); ,那麼系統會丟擲"IndexOutOfBoundsException"的異常!
但是,如果append()的引數是字元陣列(char[]),那麼結果就如原文所述,buf將包含串"Hard work". 程式碼如下:
StringBuffer buf=new StringBuffer("Hard ");
char[] text ={'W','a','x','w','o','r','k','s'};
buf.append(text ,3,4); // buf包含串"Hard work"
具體原因引用原始碼:
public synchronized StringBuffer append(char str[], int offset, int len)
{
super.append(str, offset, len);
return this;
}
JAVA 中 Stringbuffer 有append()方法
Stringbuffer其實是動態字串陣列
append()是往動態字串陣列新增,跟“xxxx”+“yyyy”相當那個‘+’號
跟String不同的是Stringbuffer是放一起的
String1+String2 和Stringbuffer1.append("yyyy")雖然列印效果一樣,但在記憶體中表示卻不一樣
String1+String2 存在於不同的兩個地址記憶體
Stringbuffer1.append(Stringbuffer2)放再一起