1.String 對象是不可變的,每個試圖修改String值得方法,實際上都是創建了一個全新的String對象。
public class StringTest { public static String upcase(String s){ return s.toUpperCase(); } public static void main(String[] args){ String q = "one"; System.out.println(q); String qq = upcase(q); System.out.println(qq); System.out.println(q); } }
運行結果
2.重載+與StringBuilder
String對象是不可變的,所以在字符串實現+的時候,編輯器創建了一個StringBuilder對象,用以構造最終的String,並且為每個字符串調用一次StringBuilder的append()方法。關於用+和StringBuilder的效率問題。
package demo4; public class TestStringBuilder { public String f1(String[] fields){ long startTime = System.currentTimeMillis(); String result = ""; for (int j = 0; j < 1000; j++) { for (int i = 0; i < fields.length; i++) { result += fields[i]; } } long endTime = System.currentTimeMillis(); System.out.println("用時:" + (endTime - startTime) + "ms"); //輸出程序運行時間 return result; } public String f2(String[] fields){ long startTime = System.currentTimeMillis(); StringBuilder result = new StringBuilder(); for (int j = 0; j < 1000; j++) { for (int i = 0; i < fields.length; i++) { result.append(fields[i]); } } long endTime = System.currentTimeMillis(); System.out.println("用時:" + (endTime - startTime) + "ms"); //輸出程序運行時間 return result.toString(); } public static void main(String[] args){ TestStringBuilder t1 = new TestStringBuilder(); String[] a = {"aaa","bbbb","ccccc","ddddd","eeeeeeeeeeeee","ffffffffggggggufguyftydjytdrtsdtrstrsresffffffffffff"}; t1.f1(a); t1.f2(a); } }
運行結果
結果顯而易見,用StringBuilder的效率要比+的效率高出很多,究其原因就是每一次的+操作其實等於new StringBuilder,而程序在for循環中的運行的時候每次都會new 一個StringBuilder,而f2()方法只生成了一個StringBuilder對象,顯式地創建StringBuilder還允許預先為其指定大小,如果已經知道最終的字符串大概有多長,那預先指定StringBuilder的大小可以避免多次重新分配緩沖。
3.正則表達式
檢查一個String是否匹配一個正則
package demo4; public class IntegerMatch { public static void main(String[] args){ System.out.println("-1234".matches("-?\\d+")); System.out.println("5678".matches("-?\\d+")); System.out.println("+911".matches("-?\\d+")); System.out.println("+911".matches("(-|\\+)?\\d+")); } }
運行結果:
String類還自帶一個非常有用的正則表達式工具-split()方法,其功能是“將字符串從政策表達式匹配的地方切開”。
package demo4;
import java.util.Arrays;
public class Splitting {
public static String knight = "Then When you have found the shrubbery,you must cut down the mightiest three in the forest...with...a herring";
public static void split(String regex){
System.out.println(Arrays.toString(knight.split(regex)));
}
public static void main(String[] args){
split(" ");
split("\\W+");
}
}
運行結果
第一句:用普通字符作為正則表達式,第一個只是按照空格划分字符串
第二句:將標點字符刪除了
4.Pattern和Matcher
package demo4; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestRegularExpression { public static void main(String[] args){ String[] str = {"abcabcabcdefabc", "abc+", "(abc)+","(abc){2,}"}; args = str; TestRegularExpression t = new TestRegularExpression(); if (args.length<2){ System.out.println("Usage:\njava TestRegularExpression characterSequence regularExpression+"); System.exit(0); } System.out.println("Input:\""+args[0]+"\""); for (String arg:args){ System.out.println("Regular expression :\""+arg+"\""); Pattern p = Pattern.compile(arg); Matcher m = p.matcher(args[0]); while (m.find()){ System.out.println("Match\""+m.group()+"\"at positions"+m.start()+"-"+(m.end()-1)); } } } }
運行結果:
Pattern對象表示編譯后的正則表達式。使用一邊以德Pattner對象上的matcher()方法,加上一個輸入字符串,從而共同構造了一個Macther對象。