JavaSE第13篇:常用API藕筋、冒泡排序、二分查找梳码、正則

核心概述:本篇我們將會學(xué)習(xí)常用的API隐圾,其中有Object類、日期相關(guān)操作類掰茶、數(shù)組相關(guān)操作類Arrays暇藏、正則表達(dá)式;同時也會學(xué)習(xí)關(guān)于數(shù)組的一些常用算法符匾,其他中有冒泡排序叨咖、二分查找法。

第一章:Object類

1.1-概述(了解)

java.lang.Object類是Java語言中的根類啊胶,每個類都使用 Object 作為超類甸各。所有對象(包括數(shù)組)都實現(xiàn)這個類的方法。

如果一個類沒有特別指定父類焰坪, 那么默認(rèn)則繼承自O(shè)bject類趣倾。例如:

public class MyClass /*extends Object*/ {
    // ...
}

1.2-本地方法(了解)

在Object類的源碼中定義了native修飾的方法,native修飾的方法稱為本地方法某饰。

本地方法的特點

  • 被native修飾的方法儒恋,非Java語言編寫,是由C++語言編寫黔漂。
  • 本地方法在運行時期進(jìn)入本地方法棧內(nèi)存诫尽,本地方法棧是一塊獨立內(nèi)存的區(qū)域。
  • 本地方法的意義是和操作系統(tǒng)進(jìn)行交互炬守。

如Object類中部分源碼:

private static native void registerNatives();
static {
    registerNatives();
}

當(dāng)程序運行的時候牧嫉,Object類會最先被加載到內(nèi)存中。類進(jìn)入內(nèi)存后首先加載自己的靜態(tài)成員,static代碼塊中調(diào)用了本地方法registerNatives()酣藻,和操作系統(tǒng)進(jìn)行交互曹洽。

查看Object類源碼:在IDEA編輯器中,新建一個類辽剧,在類中一個main方法中new Object()送淆,鼠標(biāo)停留在Object類上,按住ctrl + 點擊鼠標(biāo)怕轿,進(jìn)入Object類源碼中偷崩。

1.3-toString方法(理解)

認(rèn)識toString方法

方法聲明:public String toString():返回該對象的字符串表示。

Object類toString()方法源碼:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

源碼分析:

  • getClass().getName()返回類的全限定名字撤卢。
  • hashCode()方法返回int值环凿,可以暫時理解為對象的內(nèi)存地址。
  • Integer.toHexString()將int類型的值轉(zhuǎn)成十六進(jìn)制放吩。
  • 因此調(diào)用對象的toString()方法將看到內(nèi)存的地址值智听。

創(chuàng)建Person類,并調(diào)用方法toString()

public static void main(String[] args){
    Student stu = new Student();
    String str = stu.toString();
    System.out.println(str);    // www.penglei666.com.demo01.Student@5f2050f6
    System.out.println(stu);    // www.penglei666.com.demo01.Student@5f2050f6
}

通過程序運行渡紫,得到結(jié)論到推,在輸出語句中打印對象,就是在調(diào)用對象的toString()方法惕澎。

重寫toString方法

由于toString方法返回的結(jié)果是內(nèi)存地址莉测,而在開發(fā)中,內(nèi)存地址并沒有實際的應(yīng)用價值唧喉,經(jīng)常需要按照對象的屬性得到相應(yīng)的字符串表現(xiàn)形式捣卤,因此也需要重寫它。

public class Student {  
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Student:" + name + "," + age;
    }
    // 省略構(gòu)造器與Getter Setter
}

1.4-equals方法(理解)

認(rèn)識equals方法

方法聲明:public boolean equals(Object obj):指示其他某個對象是否與此對象“相等”八孝。

Object類equals()方法源碼:

public boolean equals(Object obj) {
    return (this == obj);
}

源碼分析:

  • this是當(dāng)前對象董朝,哪個對象調(diào)用的equals方法就表示哪個對象。
  • obj表述傳遞的參數(shù)干跛,參數(shù)類型Object子姜,可以傳遞任意類型對象。
  • this==obj 比較兩個對象的內(nèi)存地址是否相同

equals方法默認(rèn)比較兩個對象的內(nèi)存地址是否相同楼入,相同則返回true哥捕。

重寫equals方法

實際應(yīng)用中,比較內(nèi)存地址是否相同并沒有意義嘉熊,我們可以定義對象自己的比較方式遥赚,比較對象中成員變量的值是否相同。需要對方法進(jìn)行重寫阐肤。

需求:重寫equals()方法鸽捻,比較兩個對象中姓名和年齡是否相同,如果姓名和年齡都相同返回true,否則返回false御蒲。

public class Person {
    private String name;
    private int age;
    
    public boolean equals(Object obj){
        //判斷兩個對象地址弱相同,即為同一個對象
        if(this == obj)
            return true;
        //obj對象為空诊赊,無需比較厚满,返回false
        if(obj == null)
            return  false;
        //obj如果是Person類型對象,則強(qiáng)制轉(zhuǎn)換
        if(obj instanceof Person){
            Person person = (Person)obj;
            //比較兩個對象的name屬性和age屬性碧磅,如果相等碘箍,返回true
            return this.name.equals(person.name) && this.age == person.age;
        }
        return false;
    }
}

第二章:日期操作類

2.1-Date類(記憶)

構(gòu)造方法

  • public Date():從運行程序的此時此刻到時間原點經(jīng)歷的毫秒值,轉(zhuǎn)換成Date對象,分配Date對象并初始化此對象鲸郊,以表示分配它的時間(精確到毫秒)丰榴。
  • public Date(long date):將指定參數(shù)的毫秒值date,轉(zhuǎn)換成Date對象,分配Date對象并初始化此對象秆撮,以表示自從標(biāo)準(zhǔn)基準(zhǔn)時間(稱為“歷元(epoch)”四濒,即1970年1月1日00:00:00 GMT)以來的指定毫秒數(shù)。
public class Test01 {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date);    // Fri Jul 31 11:59:20 CST 2020
        Date date2 = new Date(0);
        System.out.println(date2);   // Thu Jan 01 08:00:00 CST 1970
    }
}

常用方法

  • public long getTime() 把日期對象轉(zhuǎn)換成對應(yīng)的時間毫秒值职辨。
  • public void setTime(long time) 把方法參數(shù)給定的毫秒值設(shè)置給日期對象盗蟆。
public class Test02 {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date.getTime());        // 1596168137169
        date.setTime(15961681371611L);
        System.out.println(date);                  // Tue Oct 22 00:22:51 CST 2475
    }
}

毫秒值(時間戳)和日期對象互相轉(zhuǎn)換

日期對象轉(zhuǎn)換為毫秒值:日期對象.getTime();

毫秒值轉(zhuǎn)換為日期對象:new Date(long time);

獲取當(dāng)前時間的毫秒值:System.currentTimeMillis()

public class Test02 {
    public static void main(String[] args) {
        // 從1970年到現(xiàn)在的總毫秒值(也叫時間戳)
        long millis = System.currentTimeMillis();
        System.out.println(millis);       // 1596168719242
        // 毫秒值轉(zhuǎn)日期對象
        Date date = new Date(millis);
        System.out.println(date);         // Fri Jul 31 12:11:59 CST 2020
        // 日期對象轉(zhuǎn)毫秒值
        long millis2 = date.getTime();
        System.out.println(millis2);      // 1596168719242
    }
}

2.2-DateFormat類(記憶)

概述

java.text.DateFormat 是日期/時間格式化子類的抽象類,我們通過這個類可以幫我們完成日期和文本之間的轉(zhuǎn)換,也就是可以在Date對象與String對象之間進(jìn)行來回轉(zhuǎn)換舒裤。

  • 格式化:按照指定的格式喳资,把Date對象轉(zhuǎn)換為String對象。
  • 解析:按照指定的格式腾供,把String對象轉(zhuǎn)換為Date對象

構(gòu)造方法

由于DateFormat為抽象類仆邓,不能直接使用,所以需要常用的子類java.text.SimpleDateFormat伴鳖。這個類需要一個模式(格式)來指定格式化或解析的標(biāo)準(zhǔn)节值。構(gòu)造方法為:

  • public SimpleDateFormat(String pattern):用給定的模式和默認(rèn)語言環(huán)境的日期格式符號構(gòu)造SimpleDateFormat。

參數(shù)pattern是一個字符串黎侈,代表日期時間的自定義格式察署。

常用的格式規(guī)則為:

標(biāo)識字母(區(qū)分大小寫) 含義
y
M
d
H
m
s

備注:更詳細(xì)的格式規(guī)則,可以參考SimpleDateFormat類的API文檔峻汉。

轉(zhuǎn)換方法

  • String format(Date date) 傳遞日期對象贴汪,返回格式化后的字符串。
  • Date parse(String str) 傳遞字符串休吠,返回日期對象扳埂。
  public static void main(String[] args) throws ParseException {
    // 創(chuàng)建當(dāng)前日期對象
    Date date = new Date();
    // 創(chuàng)建格式化對象
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    String dateStr = format.format(date);
    System.out.println(dateStr);   // 2019-12-07 05:37:53
    // 把格式化日期轉(zhuǎn)換為日期對象
    Date date2 = format.parse("2100-12-12 12:12:12");
    System.out.println(date2);   // Sun Dec 12 00:12:12 CST 2100
  }

2.3-Calendar類(記憶)

概述

image

java.util.Calendar是日歷類,在Date后出現(xiàn)瘤礁,替換掉了許多Date的方法阳懂。該類將所有可能用到的時間信息封裝為靜態(tài)成員變量,方便獲取。日歷類就是方便獲取各個時間屬性的岩调。

獲取日歷對象

Calendar是抽象類巷燥,不能創(chuàng)建對象,需要使用子類對象号枕。java.util.GregorianCalendar類是Calendar的子類缰揪,但是創(chuàng)建日歷對象需要根據(jù)本地的時區(qū),語言環(huán)境來創(chuàng)建葱淳,比較困難钝腺,Calendar類提供了靜態(tài)方法 getInstance()直接獲取子類的對象。

public static Calendar getInstance():使用默認(rèn)時區(qū)和語言環(huán)境獲得一個日歷赞厕。

  public static void main(String[] args) {
    // 獲取日歷對象
    Calendar calendar = Calendar.getInstance();
 }

常用方法

常用方法

  • public int get(int field):返回給定日歷字段的值艳狐。
  • public void set(int field, int value):將給定的日歷字段設(shè)置為給定值。
  • public abstract void add(int field, int amount):根據(jù)日歷的規(guī)則皿桑,為給定的日歷字段添加或減去指定的時間量毫目。
  • public Date getTime():返回一個表示此Calendar時間值(從歷元到現(xiàn)在的毫秒偏移量)的Date對象。

field:Calendar類中提供很多成員常量唁毒,代表給定的日歷字段:

字段值 含義
YEAR
MONTH 月(從0開始蒜茴,可以+1使用)
DAY_OF_MONTH 月中的天(幾號)
HOUR 時(12小時制)
HOUR_OF_DAY 時(24小時制)
MINUTE
SECOND
DAY_OF_WEEK 周中的天(周幾,周日為1浆西,可以-1使用)

代碼:

  public static void main(String[] args) {
    // 獲取日歷對象
    Calendar calendar = Calendar.getInstance();
    // 獲取當(dāng)前日期的部分?jǐn)?shù)據(jù)
    System.out.println(calendar.get(Calendar.YEAR));
    System.out.println(calendar.get(Calendar.MONTH));    // 月份 0-11
    System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
    System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
    System.out.println(calendar.get(Calendar.MINUTE));
    System.out.println(calendar.get(Calendar.SECOND));
    System.out.println(calendar.get(Calendar.DAY_OF_WEEK));

  }

練習(xí)

需求:獲取任意一年的二月有多少天

分析:

  • 可以將日歷設(shè)置到任意年的三月一日
  • 向前偏移一天
  • 獲取偏移后的日歷即可

代碼:

public static void main(String[] args) {
    //鍵盤錄入任意的年份
    Scanner sc = new Scanner(System.in);
    System.out.println("請輸入年:");
    int year = sc.nextInt();

    //設(shè)置日歷對象的年粉私、月、日
    Calendar c = Calendar.getInstance();
    c.set(year, 2, 1);

    //3月1日往前推一天近零,就是2月的最后一天
    c.add(Calendar.DATE, -1);

    //獲取這一天輸出即可
    int date = c.get(Calendar.DATE);
    System.out.println(year + "年的2月份有" + date + "天");

第三章:System類

3.1-概述(了解)

java.lang.System類中提供了大量的靜態(tài)方法诺核,可以獲取與系統(tǒng)相關(guān)的信息或系統(tǒng)級操作。System類私有修飾構(gòu)造方法久信,不能創(chuàng)建對象窖杀,直接類名調(diào)用。

3.2-常用方法(記憶)

image

3.3-測試程序運行時長(練習(xí))

需求:在控制臺輸出1-10000裙士,計算這段代碼執(zhí)行了多少毫秒

public static void main(String[] args) {
    //獲取當(dāng)前時間毫秒值
    System.out.println(System.currentTimeMillis()); 
    // 計算程序運行時間
    long start = System.currentTimeMillis();
    for (int i = 1; i <= 10000; i++) {
            System.out.println(i);
    }
    long end = System.currentTimeMillis();
    System.out.println("共耗時毫秒:" + (end - start));
 }  

3.4-arryCopy方法(記憶)

參數(shù)

  • Object src:要復(fù)制的數(shù)據(jù)源數(shù)組
  • int srcPost:數(shù)據(jù)源數(shù)組的開始索引
  • Object dest:復(fù)制后的目的數(shù)組
  • int destPos:目的數(shù)組開始索引
  • int length:要復(fù)制的數(shù)組元素的個數(shù)

代碼

將源數(shù)組中從1索引開始入客,復(fù)制3個元素到目的數(shù)組中

public static void main(String[] args){
    int[] src = {1,2,3,4,5};
    int[] dest = {6,7,8,9,0};
    //將源數(shù)組中從1索引開始,復(fù)制3個元素到目的數(shù)組中
    System.arraycopy(src,1,dest,0,3);
    for(int i = 0 ; i < dest.length;i++){
    System.out.println(dest[i]);
}

3.5-gc方法(了解)

運行垃圾回收器腿椎,JVM將從堆內(nèi)存中清理對象桌硫,清理對象的同時會調(diào)用對象的finalize()方法,JVM的垃圾回收器是通過另一個線程開啟的啃炸,因此程序中的效果并不明顯铆隘。

Person類

public class Person {
    protected void finalize() throws Throwable {
        System.out.println("對象被回收");
}

測試類:

public static void main(String[] args){
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    System.gc();
}

第四章:數(shù)組的冒泡排序

數(shù)組的排序,是將數(shù)組中的元素按照大小進(jìn)行排序南用,默認(rèn)都是以升序的形式進(jìn)行排序膀钠,數(shù)組排序的方法很多掏湾,我們講解的是數(shù)組的冒泡排序。

排序肿嘲,都要進(jìn)行數(shù)組 元素大小的比較融击,再進(jìn)行位置的交換。冒泡排序法是采用數(shù)組中相鄰元素進(jìn)行比較換位雳窟。

4.1-什么是冒泡排序(了解)

冒泡排序(Bubble Sort)砚嘴,是一種較簡單的排序算法。

重復(fù)地走訪過要排序的元素列涩拙,依次比較兩個相鄰的元素,如果順序錯誤就把他們交換過來耸采。走訪元素的工作是重復(fù)地進(jìn)行直到?jīng)]有相鄰元素需要交換兴泥,也就是說該元素列已經(jīng)排序完成。

這個算法的名字由來是因為越小的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端(升序或降序排列)虾宇,就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣搓彻,故名“冒泡排序”。

實 質(zhì):把兄鲂唷(大)的元素往前(后)調(diào)

4.2-冒泡排序的分析和實現(xiàn)(練習(xí))

需求

對數(shù)組 { 3, 6, 4, 2, 1, 5 } 進(jìn)行從小到大的排序旭贬。

該數(shù)組共6個元素。

圖解冒泡算法解析過程

image

代碼實現(xiàn)

經(jīng)上述圖解分析:代碼實現(xiàn)需要

  1. 雙重循環(huán)
    • 外層循環(huán)搪泳,控制躺數(shù)(躺數(shù)從0開始稀轨,因為數(shù)組索引從0開始,比較好計算)岸军。躺數(shù) = 數(shù)組長度 - 1
    • 內(nèi)層循環(huán)奋刽,控制每趟比較的次數(shù)。每趟比較的次數(shù) = 數(shù)組的長度 - 當(dāng)前躺數(shù) - 1
  2. 比較相鄰的兩個數(shù)字艰赞,若位置錯誤佣谐,則兩個數(shù)字交換
public class Test06 {
    public static void main(String[] args) {
        // 定義要排序的數(shù)組
        int[] arr = {3, 6, 4, 2, 1, 5};
        System.out.println("數(shù)組排序前:" + showArray(arr));
        /**
         * 冒泡排序
         */
        for (int i = 0; i < arr.length - 1; i++) {
            // 外層循環(huán)控制躺數(shù)
            // i表示當(dāng)前躺數(shù)
            for (int j = 0; j < arr.length - i - 1; j++) {
                // 內(nèi)層循環(huán)控制每趟比較的次數(shù)
                // 相鄰的兩個數(shù)字開始比較:arr[j] 和 arr[j+1]
                if (arr[j] > arr[j + 1]) {
                    // 位置錯誤發(fā)生交換
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        System.out.println("數(shù)組排序后:" + showArray(arr));
    }
    /**
     * 查看數(shù)組
     */
    public static String showArray(int[]arr) {
        StringBuilder sb = new StringBuilder();
        sb.append("{ ");
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                sb.append(arr[i]);
            } else {
                sb.append(arr[i] + ", ");
            }
        }
        sb.append(" }");
        return sb.toString();
    }
}

執(zhí)行結(jié)果:

/*
    數(shù)組排序前:{ 3, 6, 4, 2, 1, 5 }
    數(shù)組排序后:{ 1, 2, 3, 4, 5, 6 }
*/

第五章:數(shù)組的二分查找

目的:從數(shù)組中查詢一個元素,比較高效的查詢方式方妖,就是二分查找狭魂。

5.1-什么是二分查找(了解)

二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法党觅,但是雌澄,折半查找要求查詢的數(shù)組的元素是有序排列的

查找過程如下:

  • 首先仔役,假設(shè)數(shù)組中的元素是按升序排列掷伙;

  • 將數(shù)組中間位置記錄的元素值與要查找的元素值比較,如果兩者相等又兵,則查找成功任柜;

  • 否則利用中間位置的記錄將數(shù)組分成前卒废、后兩個子數(shù)組;

  • 如果中間位置記錄的元素值大于要查找元素值宙地,則進(jìn)一步查找前一子數(shù)組摔认,否則進(jìn)一步查找后一子數(shù)組。

  • 重復(fù)以上過程宅粥,直到找到滿足條件的記錄参袱,使查找成功,或直到子表不存在為止秽梅,此時查找不成功抹蚀。

5.2-二分查找的分析和實現(xiàn)(練習(xí))

需求

從數(shù)組{ 2, 5, 9, 10, 18, 20, 24 }中分別查詢出元素520企垦、3

折半查找环壤,不能簡單的除以2,需要確認(rèn)最小索引和最大索引钞诡。因為可能會多次折半(一次 折半可能查找不成功)郑现,索引最小索引和最大索引可能會變化。所以需要確定以下變量:

最小索引:min = 0

最大索引:max = 數(shù)組的長度 - 1

中間索引:(max + min)/2

圖解分析

圖解分析查詢元素5的過程

image

圖解分析查詢元素20的過程:

image

圖解分析查詢元素3(一個不存在的元素)的過程:

image

結(jié)論

對于要查詢的元素:

  1. 折半次數(shù)不確定(可能是多次)荧降,使用while循環(huán)更簡便接箫。
  2. 折半過程中,若查詢的值小于mid位置的值朵诫,則更改索引max為:max = mid - 1
  3. 折半過程中辛友,若查詢的值大于mid位置的值,則更改索引min為:min = mid + 1
  4. 查詢成功拗窃,要查詢的元素 和 mid值相等時瞎领,終止查詢。
  5. 元素中不存在該元素随夸,條件是索引min大于索引max時九默,終止查詢。

代碼

public class Test06 {
    public static void main(String[] args) {
        // 定義數(shù)組
        int[]arr = { 2, 5, 9, 10, 18, 20, 24 };
        // 查詢元素5
        int index1 = binarySearch(arr,5);
        System.out.println("從數(shù)組:{ 2, 5, 9, 10, 18, 20, 24 }查詢元素5的索引是:" + index1);
        // 查詢元素20
        int index2 = binarySearch(arr,20);
        System.out.println("從數(shù)組:{ 2, 5, 9, 10, 18, 20, 24 }查詢元素20的索引是:" + index2);
        // 查詢元素3
        int index3 = binarySearch(arr,3);
        System.out.println("從數(shù)組:{ 2, 5, 9, 10, 18, 20, 24 }查詢元素3的索引是:" + index3);
    }

    /**
     * 二分查找,返回要查找的元素的索引
     * @param arr 數(shù)組
     * @param key 要查詢的元素值
     * @return 查詢的結(jié)果宾毒,-1表示不存在該元素
     */
    public static int binarySearch(int[]arr, int key) {
        // 最小索引初始化為0
        int min = 0;
        // 最大索引初始化為數(shù)組的長度 -1
        int max = arr.length - 1;
        // 中間索引
        int mid = 0;
        // 定義查詢后的元素的索引驼修,默認(rèn)為-1,表示不存在該元素
        int index = -1;
        // 循環(huán)查詢
        while (min <= max){
            mid = (max + min)/2;
            if(key > arr[mid]) {
                min = mid + 1;
            }else if(key < arr[mid]){
                max = mid - 1;
            }else {
               index = mid;
               break;
            }
        }
        return index;
    }

}

查詢結(jié)果:

/*
    從數(shù)組:{ 2, 5, 9, 10, 18, 20, 24 }查詢元素5的索引是:1
    從數(shù)組:{ 2, 5, 9, 10, 18, 20, 24 }查詢元素20的索引是:5
    從數(shù)組:{ 2, 5, 9, 10, 18, 20, 24 }查詢元素3的索引是:-1
*/

第六章:Arrays類

我們發(fā)現(xiàn)操作數(shù)組時诈铛,不論是排序乙各、二分查找等,每次實現(xiàn)都需要自己分析寫代碼幢竹。在開發(fā)過程中耳峦,影響開發(fā)效率。所以Java中提供了操作數(shù)組的工具類Arrays焕毫。

6.1-概述(了解)

java.util.Arrays 此類包含用來操作數(shù)組的各種方法蹲坷,比如排序和搜索等驶乾。Arrays類私有修飾構(gòu)造方法,其所有方法均為靜態(tài)方法循签,調(diào)用起來非常簡單级乐。

6.2-常用方法(記憶)

image

了解更多方法可查詢API

    public static void main(String[] args) {
        // 定義數(shù)組
        int[]arr = { 2, 9, 5, 10, 24, 20, 18 };
        // 排序
        Arrays.sort(arr);
        // 排序后的數(shù)組
        System.out.println(Arrays.toString(arr));
        // 二分查找元素5的索引
        System.out.println(Arrays.binarySearch(arr,5));
        // 二分查找元素20的索引
        System.out.println(Arrays.binarySearch(arr,20));
        // 二分查找元素3的索引
        System.out.println(Arrays.binarySearch(arr,3));
    }

第七章:正則表達(dá)式

在實際開發(fā)中,我們經(jīng)常會對一些字符串做驗證县匠,比如驗證郵箱格式风科、手機(jī)號碼、身份證號碼等乞旦。此時贼穆,最有效的驗證方式就是正則表達(dá)式,只需要用正則描述驗證規(guī)則兰粉,然后直接匹配字符串即可扮惦。

7.1-概述(了解)

正則表達(dá)式是對字符串操作的一種規(guī)則,事先定義好一些字符串亲桦,這些字符串稱為規(guī)則字符串,使用規(guī)則字符串表達(dá)一些邏輯功能浊仆。

例如:指定一個字符串704181501@qq.com客峭,判斷出這個字符串是否符合電子郵件的規(guī)則。使用字符串String對象的方法是可以完成的抡柿,但是非常復(fù)雜舔琅,若使用正則表達(dá)式則會非常的簡單實現(xiàn)。

7.2-正則規(guī)則-字符類(記憶)

在中括號中定義的字符

image

7.3-正則規(guī)則-預(yù)定義字符類(記憶)

預(yù)定義字符洲劣,具有特殊含義的字符备蚓。

注意:對于\w、\d囱稽、\W郊尝、\D 在java中表示時用雙杠如\\w表示,因為\在java的字符串中表示轉(zhuǎn)義战惊。

image

7.4-正則規(guī)則-數(shù)量詞(記憶)

image

7.5-正則規(guī)則-分組(記憶)

分組流昏,就是將多個字符看做一個整體,用小括號表示吞获。

比如:"(李){4}" 表示字符“李”必須出現(xiàn)四次

比如:"(李小龍){4}" 表示字符"李小龍"必須連續(xù)出現(xiàn)四次

7.6-正則規(guī)則-轉(zhuǎn)義符(記憶)

對于况凉,具有特殊含義的字符若表示為普通字符,可以使用轉(zhuǎn)義符\,如.就在正則中表示任意字符各拷,但若就是表示為普通的點的話刁绒,則需要轉(zhuǎn)義\. java字符串中表示用\\.

7.5-Java中使用正則表達(dá)式(練習(xí))

String類matches方法使用正則表達(dá)式

方法:boolean matches(String regex)傳遞正則表達(dá)式規(guī)則烤黍,檢測字符串是否匹配正則表達(dá)式規(guī)則知市,匹配返回true傻盟。

需求:檢查手機(jī)號,檢查郵件地址初狰。

分析:

  • 手機(jī)號:只能1開頭莫杈,第二位可以是345678任意一個,第三位開始全數(shù)字奢入,總長11位筝闹。
  • 郵件地址:@前面可以是數(shù)字,字母腥光,下劃線关顷。@后面是字母和.。
public static void main(String[] args){
    //【驗證手機(jī)號碼】
    String tel = "13800138000";
    // 規(guī)則
    String telRegex = "1[345678][0-9]{9}";
    // 檢測
    boolean flag = tel.matches(telRegex);
    System.out.println(flag); 
    //【驗證郵件地址】
    String email = "lpl2015@vip.qq.com";
    String emailReg = "\\w+@(\\w+\\.)+\\w+";
    flag = email.matches(emailReg);
    System.out.println(flag);
}

String類split方法使用正則表達(dá)式

方法:String[] split(String regex)傳遞正則表達(dá)式規(guī)則武福,以正則規(guī)則對字符串進(jìn)行切割议双,返回數(shù)組。

public static void main(String[] args){
    String str1 = "ab  a   bbb  abc   aa      c";
    //對空格進(jìn)行切割
    String[] strArr =str1.split(" +");
    System.out.println(Arrays.toString(strArr));

    String str2 = "192.168.1.121";
    strArr = str2.split("\\.");
    System.out.println(Arrays.toString(strArr));
}

注意:輸出數(shù)組元素時會看到存在一個多余空格捉片,Arrays.toString()方法源碼中追加的空格平痰。

image

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市伍纫,隨后出現(xiàn)的幾起案子宗雇,更是在濱河造成了極大的恐慌,老刑警劉巖莹规,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赔蒲,死亡現(xiàn)場離奇詭異,居然都是意外死亡良漱,警方通過查閱死者的電腦和手機(jī)舞虱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來母市,“玉大人矾兜,你說我怎么就攤上這事』季茫” “怎么了焕刮?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長墙杯。 經(jīng)常有香客問我配并,道長,這世上最難降的妖魔是什么高镐? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任溉旋,我火速辦了婚禮,結(jié)果婚禮上嫉髓,老公的妹妹穿的比我還像新娘观腊。我一直安慰自己邑闲,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布梧油。 她就那樣靜靜地躺著苫耸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儡陨。 梳的紋絲不亂的頭發(fā)上褪子,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音骗村,去河邊找鬼嫌褪。 笑死,一個胖子當(dāng)著我的面吹牛胚股,可吹牛的內(nèi)容都是我干的笼痛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼琅拌,長吁一口氣:“原來是場噩夢啊……” “哼缨伊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起进宝,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤倘核,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后即彪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡活尊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年隶校,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛹锰。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡深胳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铜犬,到底是詐尸還是另有隱情舞终,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布癣猾,位于F島的核電站敛劝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纷宇。R本人自食惡果不足惜夸盟,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望像捶。 院中可真熱鬧上陕,春花似錦桩砰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庶溶,卻和暖如春煮纵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渐尿。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工醉途, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砖茸。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓隘擎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凉夯。 傳聞我的和親對象是個殘疾皇子货葬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353