13.1 不可变字符串
String对象是不可变的,String类中每一个看起来像是会修改String值的方法,实际上都是创建了一个新的String对象,最初的String对象是没有改变的。
参数是为方法提供信息的,而不是用来让方法改变自己的
13.2 重载“+”与StringBuilder
一个String对象初始化了,就不能再改变它的值了
Java中重载的“+”其实就是使用了StringBuilder的append()
StringBuilder不是线程安全的,StringBuffer是线程安全的
StringBuilder有许多方法,例如:insert() replace() subString() reverse() append() toString() delete()
13.3 无意识的递归
如果在toString方法中使用this,那么就会进入递归,最好的方法是super.toString()来代替this
13.4 String上的操作
13.5 格式化输出
13.5.1 printf()
与C的标准输出一样
13.5.2 System.out.format()
format()方法可用于PrintStream和PrintWriter,模仿于C的printf()
13.5.3 Formatter类
可以将Formatter看做一个翻译器,它将你的格式化字符串和数据翻译成需要的结果。当你创建一个Formatter时,要向其中传入参数,告诉他结果向哪里输出
13.5.4格式化说明符
%[argument_index$][flags][width][.precision]conversion
13.5.5 Formatter转换
d | 整数型 |
c | Unicode字符 |
b | Boolean |
s | String |
f | 浮点数 |
e | 浮点数(科学技术) |
x | 整数(16进制) |
h | 散列码(16进制) |
% | 字符‘%’ |
13.5.6 String.format()
String.format()是一个静态方法,接受一个与Formatter.format()方法一样的参数,但返回一个String对象
13.6 正则表达式
13.6.1 基础
""是转义符号
13.6.2 创建正则表达式
字符 | |
---|---|
B | 指定字符B |
\xhh | 16进制为oxhh的字符 |
\uhhhh | 16进制表示oxhhhh的Unicode字符 |
\t | 制表符Tab |
\n | 换行符 |
\r | 回车 |
\f | 换页 |
\e | 转义 |
字符类 | |
---|---|
. | 任意字符 |
[abc] | 包含abc的任何字符 |
[^abc] | 除了abc的任何字符 |
[a-zA-Z] | 从a-z和A-Z的任何字符 |
abc[hij] | 任意abchij的字符(合并) |
\s | 空白符 |
\S | 非空白符 |
\d | 数字0-9 |
\D | 非数字 |
\w | 词字符(a-zA-Z0-9) |
\W | 非词字符 |
逻辑操作符 | |
---|---|
XY | Y跟在X后面 |
X|Y | X或Y |
(X) | 可以在表达式用\i引用第i个捕获组 |
边界匹配符 | |
---|---|
^ | 一行的开始 |
$ | 一行的结束 |
\b | 词的边界 |
\B | 非词的边界 |
\G | 前一个匹配的结束 |
13.6.3 量词
X? | 一个或零个X |
X* | 0个或多个X |
X+ | 1个或多个X |
X{n} | 恰好n次X |
X{n,} | 至少n次X |
X{n,m} | X的次数在n,m之间 |
13.6.4Pattern和Matcher
使用正则表达式需要导入java.util.regex包然后用static Pattern.conpile()方法来编译你的正则表达式即可,他会根据传入的String字符串中的正则表达式生成一个Pattern对象,接下来把需要检索的字符串传入Pattern对象的matcher()方法,matcher()方法会返回一个Matcher对象,Matcher对象有很多有用的方法
boolean matches():用来判断整个输入字符串是否匹配
boolean lookingAt():判断字符串输入的开始部分是否匹配
boolean find():查找多个匹配,一次返回一个匹配,想要下一个要再次调用
boolean find(int start):start表示开始的地方
组(Groups)组是用括号划分的正则表达式,可以根据组的编号来引用某个组。组号为零表示整个表达式,组号为1表示被第一队括号括起来的组
group()方法只返回匹配的部分
find()可以在输入的任意位置定位正则表达式,而lookingAt()和matches()只有在正则表达式与输入的最开始处就开始匹配开会成功
Pattern标记:
Pattern类的compile()方法还有重载方法
Pattern Pattern.compile(String regex,int flag);
?i | 不考虑大小写 |
?m | 多行模式(^和$匹配一行的开头和末尾) |
?x | 忽略空白符 |
13.6.5 split()
String[] split(CharSequence input)
String[] split(CharSequence input,int limit)
以正则表达式匹配的边界切分
13.6.6 替换操作
正则表达式特别便于替换文本
replaceFirst(String replacement)以参数replacement替换第一个匹配成功的部分。
replaceAll(String replacement)替换所有匹配的部分
appendReplacement(StringBuffer sbuf,String replacement)渐进式替换,每调用一次替换下一个,可以用appendTail(StringBuffer sbuf)将输入字符串剩下的部分复制到sbuf中
13.6.7 reset()
可以将现有的Matcher对象应用于一个新的字符序列,使用不带参数的reset可以将Matcher对象重新设置到当前字符串的开始位置
13.6.8 正则表达式与java I/O
13.7 扫描输入
Scanner的构造器可以接受任何类型的输入对象(File,InputStream,String,或者任何readable对象),Scanner所有的输入,分词,以及翻译的操作都隐藏在不同类型的next方法中,
13.7.1 Scanner定界符
scanner.useDelimiter(String ”x")修改Scanner的定界符
13.7.2 用正则表达式扫描
Scanner.hasNext(pattern)
Scanner.next(pattern)
对下一个输入分词进行正则匹配
13.8 StringTokenizer
13.9 总结