字符串
13.1不可变String
String对象是不可变的。String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。
13.2重载“+”与StringBuilder
String mango = "mango";
String s = "abc" + mango + "def" + 47;
System.out.println(s);
在进行上述连接操作时,编译器会自动引入java.lang.StringBuilder类进行优化。但是如果要在toString()方法中使用循环,最好自己创建一个StringBuilder对象。
StringBuilder于JavaSE5引入,在这之前Java用的是StringBuffer,后者是线程安全的,开销也会大一些。
13.3无意识的递归
在toString方法中使用this关键字进行打印时,会导致递归发生
public class InfiniteRecursion{
public String toString(){
return "InfiniteRecursion address: " + this + "\n"; //会把this转换为字符串,调用其toString方法,导致递归发生
}
public static void main(String[] args){
List<InfiniteRecursion> v = new ArrayList<InfiniteRecursion>();
for(int i =0; i<10; i++)
v.add(new InfiniteRecursion());
System.out.println(v);
}
}
解决方法:改为super.toString()方法
13.4String上的操作
length()
charAt()
getChars(), getBytes()
toCharArray()
equals(), equalsIngoreCase()
compareTo()
contains()
contentEquals()
regionMatcher()
startsWith()
endsWith()
indexOf(),lastIndexOf()
subString(),subSequence()
concat()
replace()
toLowerCase(), toUpperCase()
trim()
valueOf()
intern()
13.5格式化输出
printf()
printg(" Row 1 : %d, %f", x, y)
System.out.format()
该方法可用于PrintStream或Printwriter对象,其中也包括System.out对象
与printf()等价
Formatter类
Java中,所有新的格式化功能都由java.util.Formatter类处理。
Formatter f = new Formatter(System.out);
String name = "tommy";
x = 10;
y=10;
f.format("%s the turtle is at (%d, %d)", name, x , y);
String.format()
一个static方法,它接受与Formatter.format()方法一样的参数,但返回一个String对象,当只需要使用format()一次的时候,String.format()用起来很方便。
13.6正则表达式
正则表达式一种强大而灵活的文本处理工具。使用正则表达式,我们能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。一旦找到了匹配这些模式的部分,你就能够随心所欲地对它们进行处理。
String类自带的正则表达式工具:matches() split() replaceFirst() replaceAll()
System.out.println("-1234".matches("-?\\d+");
System.out.println("hello world".split(" "));
System.out.println("hello world".repalceFirst("w\\w+", china);
创建正则表达式
参考JDK文档java.util.regex包中的Pattern类:
官网Pattern
Pattern和Matcher
用static Pattern.compile()方法来编译正则表达式。它会根据你的String类型的正则表达式生成一个Pattern对象。接下来,把你要检索的字符串传入Pattern对象的matcher()方法,该方法会生成一个Matcher对象,它有很多功能可用
官网Matcher
13.7扫描输入
JavaSE5新增了Scanner类,它可以大大减轻扫描输入的工作负担:
public class BetterRead{
public static BufferReader input = new BufferedReader(new StringReader("Sir Robin of Camelot\n22 1.61803"));
public static void main(String[] args){
Scanner stdin = new Scanner(input);
System.out.println("what is your name?");
String name = stdin.nextLine();
System.out.println(name);
System.out.println("how old are you?what is your favorite double?");
int age = stdin.nextInt();
double favorite = stdin.nextDouble();
//....
}
}
除了能够扫描基本类型之外,你还可以使用自定义的正则表达式进行扫描。
13.8StringTokenizer
在Java引入正则表达式和Scanner类之前,分割字符串的唯一方法是使用StringTokenizer来分词。现已废弃。