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: java 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对象。