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=
			"58.27.82.161@02/10/2005\n"+
			"204.45.234.40@02/11/2005\n"+
			"58.27.82.161@02/11/2005\n"+
			"58.27.82.161@02/12/2005\n"+
			"58.27.82.161@02/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);
		}
	}
}

总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值