TIJ-4Edition-String
1、不可变String
String对象是不可变对象,每一次修改都会创建新的String对象。
使用+拼接字符串时,也是不断创建新的字符串对象的。
为了更高效的拼接字符串,应该使用StringBuilder对象,特别是在循环中拼接时。
2、对象的打印——toString()
当直接打印对象时,会自动调用对象的toString() 方法。
如果没有重写toString() 方法,则使用Object的toString() 方法,打印对象的内存地址。
/** * 无意识的递归 */ class A{ toString(){ System.out.println(this);} }
在类的toString() 方法中打印该类的对象,则会引起隐式地递归。
3、格式化输出
在Java中,所有新的格式化功能都由java.util.Formatter类来处理。
查阅Javadoc来看具体的使用方法。https://docs.oracle.com/javase/8/docs/api/
4、正则表达式
记住Java中的正则表达式和其他语言不同:
\\ 才是转义的反斜杠, \\d 表示数字
普通的反斜杠为:\\\\
java.util.regex包中封装了正则表达式的使用。
Pattern:
正则表达式的编译表示。必须首先将指定为字符串的正则表达式编译到此类的实例中。
然后,可以使用生成的模式创建匹配器对象,该对象可以根据正则表达式匹配任意字符序列。
执行匹配所涉及的所有状态都驻留在匹配器中,因此许多匹配器可以共享相同的模式。
Pattern p = Pattern.compile("a*b"); //编译正则表达式 Matcher m = p.matcher("aaaaab"); //用正则表达式匹配并返回一个Matcher对象来表示匹配结果 boolean b = m.matches(); //获取是否匹配成功
Matcher:
通过解释模式对字符序列执行匹配操作的引擎。
匹配器是通过调用模式的匹配器方法从模式中创建的。
一旦创建,匹配器就可以用来执行三种不同类型的匹配操作:
matches方法尝试根据模式匹配整个输入序列。
lookingAt方法尝试将输入序列与模式匹配,从开头开始。
find方法扫描输入序列,寻找与模式匹配的下一个子序列。
匹配字符:
x 字符x
\\ 反斜杠字符
\0 八进制值字符
\xhh 十六进制值的字符0xhh
\uhhhh 十六进制值的Unicode字符0xhhh
\x{h…h} 十六进制值的字符0xh…h
\t 制表符('\u0009')
\n 换行符('\u000A')
\r 回车符('\u000D')
\f 换页符('\u000C')
\e 转义字符('\u001B')
\cx 对应于x的控制字符(ctrl + x)
匹配字符集:
[abc] 匹配a、b、c 中任意一个
[^abc] 不能是a、b、c中任何一个
[a-zA-Z] 所有大小写字母
[a-d[m-p]] a到d,或 m到 p 相当于 [a-dm-p] (并集)
[a-z&&[def]] d、e或 f (交集)
[a-z&&[^bc]] a到z,但不包含b和c 相当于 [ad-z] (减法)
[a-z&&[^m-p]] a到z,但不包含m到p 相当于 [a-lq-z] (减法)
预设的字符集: . 任何字符(可能匹配也可能不匹配行终止符) \d 数字:[0-9] \D 非数字:[^0-9] \s 空白字符(空格、tab、换行、换页和回车) \S 非空白字符 \w 词字符:[A-zA-Z_0-9] \W 非词字符:[^\w]
匹配边界值:
^ 行的开始
$ 行的结束
\b 字边界
\B 非字边界
\A 输入的开始
\G 上一个匹配的结束
量词: X? 0个或1个X X+ 1个或多个X X* 0个或多个X X{n} n个X X{n,} 至少n个X X{m,n} [m,n)个X
量词匹配原则:
贪婪型:能匹配多少就匹配多少,默认是贪婪型
勉强型:在量词之后加 ?来表示,匹配满足模式所需的最少字符
占有型:只有在Java中才有,不保存匹配的状态,防止被回溯。在量词后加 + 表示
匹配组:
用() 括起来的就是一个组,可以一起被匹配或不被匹配。
在表达式中,可以用组的编号来指代组。
第一个编号指代整个表达式,然后按照左括号从左到右出现顺序来排序: ((A)(B(C))): 1 ((A)(B(C))) 2 (A) 3 (B(C)) 4 (C)
匹配示例:
f\\w+ 以f开头的单词 float loate
-?\\d+ 以-开头的数字或不以-开头的数字 -1234 +1234