Thking in java(第四版)-查缺补漏(第13章)
背景
继续查缺补漏
1.不可变String
String对象是不可变的。每当把String对象作为方法的参数时,实际传递的是引用的一个拷贝。
2.javap
可以使用javap来反编译代码,查看字节码。
3.StringBuilder
在使用字符串“+”或“+=”的时候,java编译器会帮我们创建一个StringBuilder对象,然后使用append()方法
连接字符串, 使用toString返回字符串,这样做可以提高效率,避免创建多个String对象。
4.格式化输出
Java引入了format方法可用于PrintStream或PrintWriter对象
System.out.format("Row 1: [%d %f] \n",x,y);
5.Formatter类
创建对象的时候要指定输出到哪里
new Formatter(System.out)
Formatter f;
f.format("%s The Turtle is at [%d ,%d]\n",name,x,y);
6.格式化说明符
语法如下所示:
(1)width:最小尺寸 。
(2).precision:最大尺寸,应用在String时,表示打印String时输出字符的最大数量;应用于浮点数的时候,
表示四舍五入保留多少位小数, 默认是6位,位数不够则补零。
(3)默认情况下,数据是右对齐,可以通过“-”标志改变方向。
(4)argument_index$:表示显示的顺序。
(5)flags:表示标志,位数不够时,补上标志。
b:对于非boolean对象,只要该参数不为null,转换的结果就永远都是true。
7.String.format()
通过创建一个Formatter对象,将你传入的参数转给Formatter。
8.正则表达式
String.matches()可以使用正则表达式
System.out.println("-1234".matches("-?\\d+"));
String.split()可以分割成字符串数组,有一个重载的版本,可以限制字符串分割次数
"hello".split("\\W+");
String.repalceFirst():替换第一个匹配的字符串
String.replaceAll():替换所有匹配的字符串
print(s.replaceFirst("f\\w+","located"));
print(s.replaceAll("shrubbery|tree|herring", "banana"));
正则表达式的完整构造子列表,参考java.util.regex.Pattern
9.Pattern和Matcher
语法如下:把正则表达式传入 static Pattern.compile()方法生成Pattern对象,把要检索的字符串传入
Pattern对象的matcher()方法生成一个Matcher对象。
Pattern p=Pattern.compile(arg);
Matcher m=p.matcher(args[0]);
while(m.find())
print("Match\""+m.group()+"\"at positions"+m.start()+"-"+(m.end()-1));
10.组
用括号划分的正则表达式
A(B(C))D
组号为0表示整个表达式,组0是ABCD,组1是BC,组2是C。
public String group(int i)返回指定组号的正则表达式所匹配的字符串。
11.编译标记
12.appendReplacement()
执行渐进式替换。appendTail(StringBuffer sbuf),在执行了一次或则多次appendReplacement()
后,调用此方法可以将输入字符串余下的部分复制到sbuf。
while(m.find())
m.appendReplacement(sbuf, m.group().toUpperCase());
m.appendTail(sbuf);
13.reset
可以将现有的Matcher对象应用于一个新的字符序列
m.reset("fix the rig with rags");
while(m.find())
System.out.println(m.group()+" ");
如果使用不带参数的reset()方法,可以将Matcher对象重新设置到当前字符序列的起始位置。
14.扫描输入
使用Integer、Double解析数据
int age=Integer.parseInt(numArray[0]);
double favorite=Double.parseDouble(numArray[1]);
Scanner解析数据
Scanner stdin=new Scanner(SimpleRead.input);
String name=stdin.nextLine();
int age=stdin.nextInt();
double favorite=stdin.nextDouble();
Scanner定界符
Scanner scanner=new Scanner("12, 42 , 78 , 99 , 42");
scanner.useDelimiter("\\s*,\\s*");
while(scanner.hasNextInt())
System.out.println(scanner.nextInt());
15.用正则表达式扫描
package c13;
import java.util.regex.*;
import java.util.*;
public class ThreatAnalyzer {
static String threatData=
"aaa@qq.com/10/2005\n"+
"aaa@qq.com/11/2005\n"+
"aaa@qq.com/11/2005\n"+
"aaa@qq.com/12/2005\n"+
"aaa@qq.com/12/2005\n"+
"[Next log section with fiffernt data format]";
public static void main(String[] args){
Scanner scanner=new Scanner(threatData);
String pattern="(\\d+[.]\\d+[.]\\d+[.]\\d+)@"
+ "(\\d{2}/\\d{2}/\\d{4})";
while(scanner.hasNext(pattern)){
scanner.next(pattern);
MatchResult match=scanner.match();
String ip=match.group(1);
String date=match.group(2);
System.out.format("Threat on %s from %s\n", date,ip);
}
}
}
总结
这一章讲的是如何处理字符串,还运用了正则表达式来处理,使我们可以更加方便地处理复杂的字符串。