1、不可变String
- String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象。
2、StringBuilder
- 因为String对象只读特性,指向它的任何引用都不可能改变它的值。
- 如果拼接字符串每次都新建对象然后拼接,开销可能很大,因此有了StringBuilder,可以调用append动态添加。
3、无意识递归
- 因为+号后面,遇到非string,就会调用toString,下面这个toString里就会递归调用
public class InfiniteRecursion {
public String toString() {
return " InfiniteRecursion address: " + this + "\n";
}
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);
}
} ///:~
4、格式化输出
printf
printf("Row 1 : [%d %f]\n", x, y);
Formatter
- 类似一个翻译器,将你的格式化字符串与数据翻译成需要的结果。
public class Turtle {
private String name;
private Formatter f;
public Turtle(String name, Formatter f) {
this.name = name;
this.f = f;
}
public void move(int x, int y) {
f.format("%s The Turtle is at (%d,%d)\n", name, x, y);
}
public static void main(String[] args) {
PrintStream outAlias = System.out;
Turtle tommy = new Turtle("Tommy",
new Formatter(System.out));
Turtle terry = new Turtle("Terry",
new Formatter(outAlias));
tommy.move(0,0);
terry.move(4,8);
tommy.move(3,4);
terry.move(2,5);
tommy.move(3,3);
terry.move(3,3);
}
} /* Output:
Tommy The Turtle is at (0,0)
Terry The Turtle is at (4,8)
Tommy The Turtle is at (3,4)
Terry The Turtle is at (2,5)
Tommy The Turtle is at (3,3)
Terry The Turtle is at (3,3)
*///:~
5、正则表达式
字符字符类
逻辑操作符
边界匹配符
public class Rudolph {
public static void main(String[] args) {
for(String pattern : new String[]{ "Rudolph",
"[rR]udolph", "[rR][aeiou][a-z]ol.*", "R.*" })
System.out.println("Rudolph".matches(pattern));
}
} /* Output:
true
true
true
true
*///:~
量词
- 贪婪型,量词总是贪婪的,尽可能多的匹配。
- 勉强型,用问号来制定,这个量词匹配满足模式所需的最少字符数。
- 占有型。
Pattern和Matcher
- 使用Pattern.compile()方法编译正则表达式,会生成一个Pattern对象。
- 把需要匹配的传到Pattern对象的match()方法,会生成一个Matcher对象。
- Matcher.find()方法可查找多个匹配,find()像迭代器那样向前遍历输入字符串。
public class Finding {
public static void main(String[] args) {
Matcher m = Pattern.compile("\\w+")
.matcher("Evening is full of the linnet's wings");
while(m.find())
printnb(m.group() + " ");
print();
int i = 0;
while(m.find(i)) {
printnb(m.group() + " ");
i++;
}
}
} /* Output:
Evening is full of the linnet s wings
Evening vening ening ning ing ng g is is s full full ull ll l of of f the the he e linnet linnet innet nnet net et t s s wings wings ings ngs gs s
*///:~
- 组,使用括号划分的正则表达式,可以根据组的编号来引用某个组。组号为0表示整个表达式,组号1表示第一对括号括起的数组。A(B(C))D,组0是ABCD,组1是BC,组2是C。
- find可以在输入的任意位置定位表达式,lookingAt和matches只有在正则表达式与输入的最开始处就匹配时才会成功,matches只有在整个输入都匹配时才成功。
网友评论