读书笔记 JAVA编程思想 第13章 字符串
2017-06-16 16:36
507 查看
可以证明,字符串操作是计算机程序设计中最常见的行为
13.1 不可变的String
String对象是不可变的,每当修改String对象的时候,实际上都是创建了一个新的String对象,最初的String对象丝毫未动。
13.2 重载“+”与StringBuilder
String对象的不可变性带来一定的效率问题,例如为String对象重载的“+”操作符。(用于String的“+”、“+=”是java中仅有的两个重载过的操作符,而Java并不允许程序员重载任何操作符)。
不可变性会导致生成了一大堆新的中间对象需要进行垃圾回收,显然性能相当糟糕。那么java设计师是如何解决这个问题的呢?中间过程中编译器自动引入了StringBuilder类,调用append()方法,总共四次,用来构造最终的String,最后调用toString()方法生成结果,并存为s。
虽然编译器会自动的优化性能,但是程序员依然不可以随意的使用String对象。总体原则是:如果字符串操作比较简单,那么你可以信赖编译器,但是你要在toString()方法中使用循环,那么最好自己创建一个StringBuilder对象,用它来构造最终的结果。
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对象,它有很多方法可以拿来用。 看代码:
可能一开始main方法的参数数组args长度为0,怎么给它赋值呢?Eclipse解决方案是这样的:
右键—>Run as
Run configurations……
找到(x)=Arguments,在下面编辑框里输入参数列表即可。
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 编程思想》第13章 字符串 笔记
- java编程思想4-读书笔记-第11章
- 2014年2月8日 java编程思想 String字符串学习 面试题目回顾
- Java编程思想-13字符串
- Java编程思想 第二章读书笔记
- java 编程思想读书笔记(5)--java异常
- 读书笔记 之 java编程思想3
- Java编程思想笔记——第十三章 字符串
- java编程思想-字符串
- java 编程思想 读书笔记
- java编程思想笔记--字符串部分一
- 读书笔记 之java编程思想
- JAVA编程思想-第十三章 字符串
- 《Java 编程思想》004 switch对字符串支持的引申思考
- java编程思想-读书笔记(1)对象入门
- java编程思想笔记--字符串部分二
- Java 编程思想读书笔记(一)---多态
- JAVA编程思想学习总结:第十三章字符串
- Java编程思想 第七章读书笔记
- Java编程思想-第一章 1.5-1.8读书笔记