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

来源:互联网 发布:淘宝店铺经营策略 编辑:程序博客网 时间:2024/06/05 10:15

可以证明,字符串操作是计算机程序设计中最常见的行为

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-14RegularExpression: "abc+"Match "abc" at positions 0-2Match "abc" at positions 3-5Match "abc" at positions 6-8Match "abc" at positions 12-14RegularExpression: "(abc)+"Match "abcabcabc" at positions 0-8Match "abc" at positions 12-14RegularExpression: "(abc){2,}"Match "abcabcabc" at positions 0-8 */

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

  1. 右键—>Run as
  2. Run configurations……
  3. 找到(x)=Arguments,在下面编辑框里输入参数列表即可。
    这里写图片描述
原创粉丝点击