首頁 > 軟體

JAVA新手小白學正規表示式、包裝類、自動裝箱/自動拆箱以及BigDecimal

2022-03-01 16:00:28

1 正規表示式Regex

1.1 概述

正確的字串格式規則。

常用來判斷使用者輸入的內容是否符合格式的要求,注意是嚴格區分大小寫的。

1.2 常見語法

1.3 String提供了支援正規表示式的方法

Matches(正則) : 當前字串能否匹配正規表示式

replaceAll(正則,子串) : 替換子串

split(正則) : 拆分字串

1.4 練習:測試輸入身份證號

建立包: cn.tedu.api

建立類: TestRegex.java

package cn.tedu.api;

import java.util.Scanner;
/*本類用於正規表示式入門案例*/
//需求:接收使用者輸入的身份證號,並將判斷的結果輸出
public class TestRegex {
    public static void main(String[] args) {
        //1.編輯正規表示式
        //身份證號的規律:一共是18位元,前17位是數子,第18位元有可能是數位,也有可能是X
        //String regex = "[0-9]{17}[0-9X]";
        /*單個在Java中有特殊的含義,表示跳脫符號,不認為是一個斜槓
         * 所以如果想要表示斜槓,需要在它的前面加一個用來跳脫的
         * 也就是\才表示成一個單純的斜槓
         * t -- 製表符  r回車符 n換行符*/
        String regex = "\d{17}[0-9X]";

        //2.定義變數用來接收使用者輸入的身份證號:
        String input;

        //3.判斷使用者輸入的資料是否符合正規表示式,如果不正確,繼續輸入
        do {
            System.out.println("請輸入您的身份證號:");
            input = new Scanner(System.in).nextLine();
            if (input.matches(regex)) {//如果身份證號正確
                System.out.println("恭喜你!輸入正確!");
                return;//結束本方法
            }
        } while (!input.matches(regex));//只要不符合正規表示式,就繼續輸入
    }
}

2 包裝類

把基本型別進行包裝,提供更加完善的功能。

基本型別是沒有任何功能的,只是一個變數,記錄值,而包裝類可以有更加豐富的功能

2.1 與基本型別的對應關係

2.2 Number

數位包裝類的抽象父類別。

提供了各種獲取值的方式。

2.3 Integer 建立物件

方式一: new Integer(5);

方式二: Integer.valueOf(5);

Integer類中包含256個Integer快取物件,範圍是 -128~127

使用valueOf()時,如果指定範圍內的值,直接存取快取物件不新建;如果指定範圍外的值,直接新建物件。

常見方法

static int parseInt(String s) 將字串引數作為有符號的十進位制整數進行解析

2.4 練習: Number之Integer

建立包: cn.tedu. api

建立類: TestNumber.java

package cn.tedu.api;
/*本類用於測試包裝類*/
public class TestNumber {
    //1.定義成員變數,注意要設定成靜態的,因為靜態只能呼叫靜態
    static Integer i0;
    public static void main(String[] args) {
        //2.列印Integer的預設值進行測試
        System.out.println(i0);//預設值為null

        //3.建立int型別對應的包裝類Integer型別的物件--方式一
        Integer i1 = new Integer(5);
        Integer i11 = new Integer(5);
        System.out.println( i1 == i11 );//false,==對於參照型別,比較的是地址值

        //4.建立int型別對應的包裝類Integer型別的物件--方式二
        /*Integer有一個高效的效果,資料在:(-128~127)
        * 在此範圍內,相同的資料只會存一次,後續再存都是使用之前存過的資料*/
        Integer i2 = Integer.valueOf(127);
        Integer i3 = Integer.valueOf(127);
        System.out.println(i1 == i2);//false
        System.out.println(i2 == i3);//true
        //滿足高效效果的3個條件:Integer valueOf() -128~127
        Integer i4 = Integer.valueOf(300);
        Integer i5 = Integer.valueOf(300);
        System.out.println(i4 == i5);//false

    }
}


2.5 Double

建立物件

  • new Double(3.14)
  • Double.valueOf(3.14)//和 new 沒有區別 常用方法

Double.parseDouble();

2.5 練習: Number之Double

建立包: cn.tedu.api

建立類: TestNumber.java

package cn.tedu.api;
/*本類用於測試基本型別的包裝類*/
public class TestNumber {
    public static void main(String[] args) {
        //1.建立int包裝類Integer物件的方式1
        Integer i1 = new Integer(100);
        Integer i11 = new Integer(100);
        System.out.println(i1 == i11);//false,new了兩次,是兩個不同的物件,地址值不同

        //2.建立int包裝類Integer物件的方式2
        /*Integer有一個高效的效果,但是必須滿足3個條件:
        * 1.是Integer型別
        * 2.使用valueOf()的建立方式
        * 3.資料在-128~127的範圍內
        * 滿足以上條件,相同的資料只會存一次,後續再使用都是以前存過的資料*/
        Integer i2 = Integer.valueOf(100);
        Integer i22 = Integer.valueOf(100);
        System.out.println(i2 == i22);//true

        Integer i3 = Integer.valueOf(300);
        Integer i33 = Integer.valueOf(300);
        System.out.println(i3 == i33);//false 超出高效的資料範圍-128~127

        //3.建立double包裝類Double物件的方式1
        Double d1 = new Double(3.14);
        Double d11 = new Double(3.14);
        System.out.println(d1 == d11);//false,建立兩個不同的物件,地址值不同

        //4.建立double包裝類Double物件的方式2
        /*只有Integer才有高效的效果Double是沒有的*/
        Double d2 = Double.valueOf(3.14);
        Double d22 = Double.valueOf(3.14);
        System.out.println(d1 == d2);//false
        System.out.println(d2 == d22);

        //5.測試常用方法
        //這個方法的作用就是把傳入的String型別的資料轉成int
        /*物件是什麼型別的,就可以使用這個類的所有資源
        i1是Integer型別的物件,所以可以使用parseInt()將String型別的資料轉為int型別
        d1是Double型別的物件,所以可以使用parseDouble()將String型別的資料轉為double型別*/
        System.out.println(i1.parseInt("800")+8);//808->int+int
        System.out.println(d1.parseDouble("2.2")+3.1);//5.300000000000001->double+double
    }
}

3 自動裝箱和自動拆箱

3.1 概述

自動裝箱:把 基本型別 包裝成對應的 包裝型別 的過程

Integer a = 5;//a是參照型別,參照了包裝物件的地址。

編譯器會完成物件的自動裝箱:Integer a = Integer.valueOf(5);

自動拆箱:從包裝型別的值,自動變成 基本型別的值

int i = a;//a現在是包裝型別,沒法給變數賦值,需要把5取出來。

編譯器會完成自動拆箱:int i = a.intValue();

3.2 練習: 自動裝箱與自動拆箱測試

建立包: cn.tedu.api

建立類: TestBox.java

package cn.tedu.api;
/*本類用於測試自動裝箱和自動拆箱*/
public class TestBox {
    public static void main(String[] args) {
        //1.定義包裝型別的資料
        //回顧:以前建立包裝型別的兩種方式
        Integer i1 = new Integer(127);
        Integer i2 = Integer.valueOf(127);
        //2.現在的方式:
        /*1.自動裝箱:編譯器會自動把基本型別int 5,包裝成包裝型別Integer
        * 然後交給i3來儲存,自動裝箱底層發生的程式碼Integer.valueOf(5);
        * valueOf()的方向: int --> Integer*/
        Integer i3 = 5;//不會報錯,這個現象就是自動裝箱
        /*2.自動拆箱:編譯器會自動把包裝型別的i1拆掉"箱子",變回基本型別資料127
        * 然後交給i4來儲存,自動拆箱底層發生的程式碼:i1.intValue();
        * intValue()的方向:Integer -> int
        * */
        int i4 = i1;//不會報錯,這個現象就是自動拆箱
    }
}

4 BigDecimal

BigDecimal:常用來解決精確的浮點數運算不精確的問題

4.1 建立物件

方式一 :

BigDecimal(double val)

將double轉換為BigDecimal,後者是double的二進位制浮點值十進位制表示形式,有坑!

方式二 :

BigDecimal(String val)

將String型別字串的形式轉換為BigDecimal

4.2 常用方法

Add(BigDecimal bd) : 做加法運算
Subtract(BigDecimal bd) : 做減法運算
Multiply(BigDecimal bd) : 做乘法運算
Divide(BigDecimal bd) : 做除法運算,除不盡時會拋異常
Divide(BigDecimal bd,保留位數,舍入方式) : 除不盡時使用
setScale(保留位數,舍入方式) : 同上
pow(int n) : 求資料的幾次冪

4.3 練習:測試常用方法

建立包: cn.tedu.bigdecimal

建立類: TestBigDecimal.java

需求: 接收使用者輸入的兩個小數,做運算

package cn.tedu.api;

import java.math.BigDecimal;
import java.util.Scanner;

public class TestBigDecimal {
    public static void main(String[] args) {
        //f1();//使用普通的 +-*/ 四則運算,暴露出浮點數運算不精確的問題
        f2();//使用BigDecimal來解決浮點數運算不精確的問題
    }

    private static void f2() {
        //1.提示並接收使用者輸入的兩個小數
        System.out.println("請輸入您要計算的兩個小數:");
        double a = new Scanner(System.in).nextDouble();
        double b = new Scanner(System.in).nextDouble();
        //2.建立工具類物件,把基本型別a和b交給工具類物件BigDecimal來儲存
        /*1.最好不要用double作為建構函式的引數,不然還會有不精確的現象,有坑!!!*/
        /*2.最好使用過載的,引數型別是String的建構函式
        * double轉String,直接拼個空串就可以*/
        BigDecimal bd1 = new BigDecimal(a+"");
        BigDecimal bd2 = new BigDecimal(b+"");

        //3.通過BigDecimal的物件來呼叫其方法,實現精確運算
        //3.1 定義BigDecimal型別的參照型別變數來儲存結果
        BigDecimal bd3;
        //3.2 Add(BigDecimal bd) : 做加法運算
        bd3 = bd1.add(bd2);
        System.out.println(bd3);
        //3.3 Subtract(BigDecimal bd) : 做減法運算
        bd3 = bd1.subtract(bd2);
        System.out.println(bd3);
        //3.4 Multiply(BigDecimal bd) : 做乘法運算
        bd3 = bd1.multiply(bd2);
        System.out.println(bd3);
        //3.5 Divide(BigDecimal bd) : 做除法運算,除不盡時會拋異常
        /*3.除法運算,除不盡時會丟擲異常ArithmeticException*/
        //方案一:(除不盡時有問題)
        //bd3 = bd1.divide(bd2);
        /*divide(m,n,o)
        m是要除以哪個物件,n指要保留幾位,o指舍入方式(比如四捨五入)*/
        //方案二:
        bd3 = bd1.divide(bd2,3,BigDecimal.ROUND_HALF_UP);
        System.out.println(bd3);

    }

    private static void f1() {
        //1.提示並接收使用者輸入的兩個小數
        System.out.println("請輸入您要計算的兩個小數:");
        double a = new Scanner(System.in).nextDouble();
        double b = new Scanner(System.in).nextDouble();

        //2.做運算
        System.out.println(a + b);//不精確
        System.out.println(a - b);//不精確
        System.out.println(a * b);//不精確
        System.out.println(a / b);//不精確
    }
}

到這裡,API第一課就結束啦,恭喜你又闖過一關哦~

5 拓展

舍入方式解析

ROUND_HALF_UP 四捨五入,五入 如:4.4結果是4; 4.5結果是5

ROUND_HALF_DOWN 五舍六入,五不入 如:4.5結果是4; 4.6結果是5

ROUND_HALF_EVEN 公平舍入(銀行常用)

比如:在5和6之間,靠近5就捨棄成5,靠近6就進位成6,如果是5.5,就找偶數,變成6

ROUND_UP 直接進位,不算0.1還是0.9,都進位

ROUND_DOWN 直接捨棄,不算0.1還是0.9,都捨棄

ROUND_CEILING(天花板) 向上取整,取實際值的大值

朝正無窮方向round 如果為正數,行為和round_up一樣,如果為負數,行為和round_down一樣

ROUND_FLOOR(地板) 向下取整,取實際值的小值

朝負無窮方向round 如果為正數,行為和round_down一樣,如果為負數,行為和round_up一樣

總結

到此這篇關於JAVA新手小白學正規表示式、包裝類、自動裝箱/自動拆箱以及BigDecimal的文章就介紹到這了,更多相關JAVA正規表示式、包裝類、自動裝箱/拆箱及BigDecimal內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com