您的位置:首页 > 编程语言 > Java开发

读书笔记 JAVA编程思想 第13章 字符串

2017-06-16 16:36 507 查看
可以证明,字符串操作是计算机程序设计中最常见的行为

13.1 不可变的String

String对象是不可变的,每当修改String对象的时候,实际上都是创建了一个新的String对象,最初的String对象丝毫未动。

13.2 重载“+”与StringBuilder

String对象的不可变性带来一定的效率问题,例如为String对象重载的“+”操作符。(用于String的“+”、“+=”是java中仅有的两个重载过的操作符,而Java并不允许程序员重载任何操作符)。

String s="a"+"b"+"c"+"d";


不可变性会导致生成了一大堆新的中间对象需要进行垃圾回收,显然性能相当糟糕。那么java设计师是如何解决这个问题的呢?中间过程中编译器自动引入了StringBuilder类,调用append()方法,总共四次,用来构造最终的String,最后调用toString()方法生成结果,并存为s。

虽然编译器会自动的优化性能,但是程序员依然不可以随意的使用String对象。总体原则是:如果字符串操作比较简单,那么你可以信赖编译器,但是你要在toString()方法中使用循环,那么最好自己创建一个StringBuilder对象,用它来构造最终的结果。

package string;
import java.util.Random;

public class UsingStringBuilder {
public static Random random=new Random(47);
public String toString(){
StringBuilder result=new StringBuilder("[");
for(int i=0;i<25;i++){
result.append(random.nextInt(100));
result.append(", ");
}
//删除最后的逗号和空格
result.delete(result.length()-2,result.length());
result.append("]");
// 调用StringBuilder类的toString方法
return result.toString();

}
public static void main(String[] args){
UsingStringBuilder usb=new UsingStringBuilder();
System.out.println(usb);//usb.toString()做参数是一样的
}
}
/*输出结果
* [58, 55, 93, 61, 61, 29, 68, 0, 22, 7, 88, 28, 51
* , 89, 9, 78, 98, 61, 20, 58, 16, 40, 11, 22, 4]
*/


StringBuilder提供了丰富而全面的方法,包括append(),toString(),delete(),insert(),replace(),substring()甚至reverse()。

13.4 String上的操作

这个到处都有,我就不总结了,贴一个别人的劳动成果。

总结:

String是固定不变的,而StringBuffer和StringBuilder可以改变它们的值。

StringBuffer和StringBuilder唯一的区别是StringBuilder是非同步的而StringBuffer是同步的。

当系统需要运行单线程时,使用StringBuilder比较好。StringBuilder比StringBuffer更有效用。

选择原则:

如果你的文本(字符串)不会改变就用String类因为String对象是不可变的。如果你的文本(字符串)可以改变并且在单线程中访问,使用StringBuilder。如果你的文本(字符串)可以改变并且在多线程中访问,使用StringBuffer

13.6 正则表达式

一般来说,正则表达式就是以某种方式来描述字符串。实际项目开发中,我都是在前端使用正则表达式,例如js或者jQuery中。Java中比起功能有限的String类,我们更愿意构造功能强大的正则表达式对象。Pattern.compile()方法会根据你的String类型的正则表达式生成一个Pattern对象。接下来,把你想要检索的字符串传入Pattern对象的matcher方法,matcher方法会生成一个Matcher对象,它有很多方法可以拿来用。 看代码:

package string;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestRegularExpression {

public static void main(String[] args){
if(args.length<2){
System.out.println("quiet");
System.exit(0);
}
System.out.println("Input \""+args[0]+"\"");
for(String arg : args){
System.out.println("RegularExpression: \""+arg+"\"");
//Pattern对象表示编译后的正则表达式
Pattern pattern=Pattern.compile(arg);
//Pattern对象使用matcher()方法生成了一个Matcher对象
Matcher matcher=pattern.matcher(args[0]);
/*find()用来在字符序列中查找多个匹配,matchers()用来判断整个输入
* 字符串是否匹配正则表达式模式
* 警告!不要把find()方法换成matchers(),不信你试试
*/
while(matcher.find()){
// 在匹配操作成功后,start()返回先前匹配的起始索引位置,
// end()返回所匹配的最后字符的索引加一的值。
System.out.println("Match \""+matcher.group()+"\" at positions "+
matcher.start()+"-"+(matcher.end()-1));
}
}

}
}
/*Input "abcabcabcdefabc"
RegularExpression: "abcabcabcdefabc"
Match "abcabcabcdefabc" at positions 0-14
RegularExpression: "abc+"
Match "abc" at positions 0-2
Match "abc" at positions 3-5
Match "abc" at positions 6-8
Match "abc" at positions 12-14
RegularExpression: "(abc)+"
Match "abcabcabc" at positions 0-8
Match "abc" at positions 12-14
RegularExpression: "(abc){2,}"
Match "abcabcabc" at positions 0-8
*/


可能一开始main方法的参数数组args长度为0,怎么给它赋值呢?Eclipse解决方案是这样的:

右键—>Run as

Run configurations……

找到(x)=Arguments,在下面编辑框里输入参数列表即可。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  读书笔记 java