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對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM