java 字符串与正则表达式

1.String 对象是不可变的,每个试图修改String值得方法,实际上都是创建了一个全新的String对象。

public class StringTest {
    public static String upcase(String s){
        return s.toUpperCase();
    }
    public static void main(String[] args){
        String q = "one";
        System.out.println(q);
        String qq = upcase(q);
        System.out.println(qq);
        System.out.println(q);
    }
}

运行结果

2.重载+与StringBuilder

String对象是不可变的,所以在字符串实现+的时候,编辑器创建了一个StringBuilder对象,用以构造最终的String,并且为每个字符串调用一次StringBuilder的append()方法。关于用+和StringBuilder的效率问题。

package demo4;

public class TestStringBuilder {
    public String f1(String[] fields){
        long startTime = System.currentTimeMillis();
        String result = "";
        for (int j = 0; j < 1000; j++) {
            for (int i = 0; i < fields.length; i++) {
                result += fields[i];
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("用时:" + (endTime - startTime) + "ms"); //输出程序运行时间
        return result;
    }

    public String f2(String[] fields){
        long startTime = System.currentTimeMillis();
        StringBuilder result = new StringBuilder();
        for (int j = 0; j < 1000; j++) {
            for (int i = 0; i < fields.length; i++) {
                result.append(fields[i]);
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("用时:" + (endTime - startTime) + "ms"); //输出程序运行时间
        return result.toString();
    }

    public static void main(String[] args){
        TestStringBuilder t1 = new TestStringBuilder();
        String[] a = {"aaa","bbbb","ccccc","ddddd","eeeeeeeeeeeee","ffffffffggggggufguyftydjytdrtsdtrstrsresffffffffffff"};
        t1.f1(a);
        t1.f2(a);
    }
}

运行结果

 

结果显而易见,用StringBuilder的效率要比+的效率高出很多,究其原因就是每一次的+操作其实等于new StringBuilder,而程序在for循环中的运行的时候每次都会new 一个StringBuilder,而f2()方法只生成了一个StringBuilder对象,显式地创建StringBuilder还允许预先为其指定大小,如果已经知道最终的字符串大概有多长,那预先指定StringBuilder的大小可以避免多次重新分配缓冲。

3.正则表达式

 检查一个String是否匹配一个正则

package demo4;

public class IntegerMatch {
    public static void main(String[] args){
        System.out.println("-1234".matches("-?\\d+"));
        System.out.println("5678".matches("-?\\d+"));
        System.out.println("+911".matches("-?\\d+"));
        System.out.println("+911".matches("(-|\\+)?\\d+"));
    }
}

运行结果:

String类还自带一个非常有用的正则表达式工具-split()方法,其功能是“将字符串从政策表达式匹配的地方切开”。

package demo4;

import java.util.Arrays;

public class Splitting {
public static String knight = "Then When you have found the shrubbery,you must cut down the mightiest three in the forest...with...a herring";
public static void split(String regex){
System.out.println(Arrays.toString(knight.split(regex)));
}
public static void main(String[] args){
split(" ");
split("\\W+");
}
}

运行结果

 

第一句:用普通字符作为正则表达式,第一个只是按照空格划分字符串

第二句:将标点字符删除了

4.Pattern和Matcher

package demo4;

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

public class TestRegularExpression {
    public static void main(String[] args){
        String[] str = {"abcabcabcdefabc", "abc+", "(abc)+","(abc){2,}"};
        args = str;
        TestRegularExpression t = new TestRegularExpression();
        if (args.length<2){
            System.out.println("Usage:\njava TestRegularExpression characterSequence regularExpression+");
            System.exit(0);
        }

        System.out.println("Input:\""+args[0]+"\"");
        for (String arg:args){
            System.out.println("Regular expression :\""+arg+"\"");
            Pattern p = Pattern.compile(arg);
            Matcher m = p.matcher(args[0]);
            while (m.find()){
                System.out.println("Match\""+m.group()+"\"at positions"+m.start()+"-"+(m.end()-1));
            }
        }
    }
}

运行结果:

 

Pattern对象表示编译后的正则表达式。使用一边以德Pattner对象上的matcher()方法,加上一个输入字符串,从而共同构造了一个Macther对象。

 

posted @ 2019-03-10 23:04  xiayq  阅读(21377)  评论(0编辑  收藏  举报