JAVA新手小白學正則表達式、包裝類、自動裝箱/自動拆箱以及BigDecimal
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內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java精確計算BigDecimal類詳解
- Java BigDecimal案例詳解
- BigDecimal的加減乘除計算方法詳解
- java BigDecimal類案例詳解
- JAVA biginteger類bigdecimal類的使用示例學習