字元串 在java中,字元串被作為String類型的對象處理。String類位於java.lang包中,預設情況下,該包被自動導入所有的程式。 創建String對象的方法: String對象創建後不能被修改,是不可變的,所謂的修改其實是創建了新的對象,所指向的記憶體空間不同。 如果需要一個可以改變的字 ...
- 字元串
在java中,字元串被作為String類型的對象處理。String類位於java.lang包中,預設情況下,該包被自動導入所有的程式。
創建String對象的方法:
String s1 = "java"; String s2 = new String(); String s3 = new String("Java");
- Java字元串的不變性
String對象創建後不能被修改,是不可變的,所謂的修改其實是創建了新的對象,所指向的記憶體空間不同。
如果需要一個可以改變的字元串可以使用StringBuffer或者StringBuilder。
每次 new 一個字元串就是產生一個新的對象,即便兩個字元串的內容相同,使用 ”==” 比較時也為 ”false” ,如果只需比較內容是否相同,應使用 ”equals()” 方法。
常量池在Java中是用於保存在編譯期已確定的、已編譯的class文件中的數據。
package cn.test; public class Demo12 { public static void main(String[] args) { String s1 = "java";//先檢查字元串常量池中是否有"java"字元串,如果有則直接指向,如果沒有就在字元串常量池中添加"java"字元串並指向它,所以這種方式創建字元串時最多創建一個對象,或者不創建對象 String s2 = "java";//s2直接指向字元串常量池中的"java" String s3 = new String("java");//在堆記憶體申請一塊記憶體存儲字元串"java",s3指向其記憶體塊對象,同時檢查字元串常量池中是否有"java"字元串,如果沒有就添加字元串"java"到常量池中,所以new String()有可能創建兩個對象 String s4 = new String("java"); System.out.println(s1 == s2); System.out.println(s1 == s3); System.out.println(s3 == s4); s1 = "歡迎來到" + s1; System.out.println(s1); System.out.println(s3.equals(s4)); } }
執行結果:
true
false
false
歡迎來到java
true
- String類常用的方法
舉例1:
String fileName = "HelloWorld.java"; String email = "[email protected]"; // 判斷.java文件名是否正確:合法的文件名應該以.java結尾 int index = fileName.lastIndexOf('.'); String prefix = fileName.substring(index+1); if ( index > 0 && prefix.equals("java")) { System.out.println("Java文件名正確"); } else { System.out.println("Java文件名無效"); } // 判斷郵箱格式是否正確:合法的郵箱名中至少要包含"@", 並且"@"是在"."之前 int index2 = email.indexOf('@'); int index3 = email.indexOf('.'); if (index2 != -1 && index3 > index2) { System.out.println("郵箱格式正確"); } else { System.out.println("郵箱格式無效"); }
String str = "boo:and:foo";
String[] arr = str.split(":");
for (int i = 0; i < arr.length; i++)
{
System.out.print(arr[i]);
}
執行結果:
Java文件名正確
郵箱格式正確
booandfoo
舉例2:
String str = "abcd阿"; byte[] b = str.getBytes(); for (int j = 0; j < b.length; j++) { System.out.print("[" + b[j] + "]"); }
運行結果:
[97][98][99][100][-80][-94]
註:1 個位元組等於 8 位, gbk 編碼中 1 個漢字字元存儲需要 2 個位元組,1 個英文字元存儲需要 1 個位元組
示例3:
String s = "aljlkdsflkjsadjfklhasdkjlflkajdflwoiudsafhaasdasd"; // 出現次數 int num = 0; // 迴圈遍歷每個字元,判斷是否是字元 a ,如果是,累加次數 for ( int i = 0;i < s.length(); i++ ) { // 獲取每個字元,判斷是否是字元a if ( s.charAt(i) == 'a' ) { // 累加統計次數 num++; } } System.out.println("字元a出現的次數:" + num);
運行結果:
字元a出現的次數:8
- StringBuilder類
String類具有可變性,頻繁操作字元串時會產生很多臨時變數,使用StringBuilder或StringBuffer就可以避免這個問題。它們基本相似,不同之處是StringBuffer是線程安全的,所以性能略高。因此,一般情況下創建一個內容可變的字元串對象,優先使用StringBuilder類。
StringBuilder str2 = new StringBuilder("java");
StringBuilder類的常用方法:
註:String str = "a" + s; 其效率與 String str = new StringBuilder().append("a").append(s).toString();是一樣的。
關於‘+’的原理,參考:http://blog.csdn.net/zengshunyao/article/details/40023577