欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Thking in java(第四版)-查缺补漏(第13章)

程序员文章站 2024-03-17 17:44:58
...

背景

继续查缺补漏

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.格式化说明符

语法如下所示:

Thking in java(第四版)-查缺补漏(第13章)

(1)width:最小尺寸   。

(2).precision:最大尺寸,应用在String时,表示打印String时输出字符的最大数量;应用于浮点数的时候,

表示四舍五入保留多少位小数, 默认是6位,位数不够则补零。

(3)默认情况下,数据是右对齐,可以通过“-”标志改变方向。

(4)argument_index$:表示显示的顺序。

(5)flags:表示标志,位数不够时,补上标志。

Thking in java(第四版)-查缺补漏(第13章)

 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.编译标记

Thking in java(第四版)-查缺补漏(第13章)

 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);
		}
	}
}

总结

这一章讲的是如何处理字符串,还运用了正则表达式来处理,使我们可以更加方便地处理复杂的字符串。